Algoritmos Computacionais

Artigos sobre lógica de programação por Tiago Madeira

algoritmo: do Lat. algorithmos < Ár. alkharizmi: [Inform.] conjunto de etapas bem definidas necessárias para chegar à resolução de um problema.

Archive for the 'Ordenação' Category

Ordenação por Inserção

Wednesday, January 11th, 2006

Também conhecida como Insertion Sort, a Ordenação por Inserção consiste em inserir um elemento LaTeX: n num vetor já ordenado de LaTeX: n-1 elementos. Neste artigo, apresento-lhes este simples algoritmo para ordenação de vetores.

O pseudocódigo da ordenação por inserção é o seguinte:

1. para j LaTeX: leftarrow{} 2 até comprimento do vetor, faça
2.	elemento LaTeX: leftarrow{} vetor[j]
3.	i LaTeX: leftarrow{} j - 1
4.	enquanto i > 0 e vetor[i] > elemento, faça
5.		vetor[i + 1] LaTeX: leftarrow{} vetor[i]
6.		i LaTeX: leftarrow{} i - 1
7.	fim-enquanto
8.	vetor[i + 1] LaTeX: leftarrow{} elemento
9. fim-para

Para explicar eu vou fazer uma coisa que sempre faço para corrigir meus algoritmos, fingir que sou o programa, executando cada passo manualmente (claro que geralmente faço mais rápido, porque não preciso escrever tudo que faço). Vamos iniciar com o seguinte vetor v.

v[1] v[2] v[3] v[4] v[5] v[6]
5 3 7 8 2 5

Aí o código me manda começar com LaTeX: j=2 e iterar até o comprimento do vetor (6). A primeira ordem que ele me dá é para armazenar o elemento LaTeX: a[j] (LaTeX: a[2]) na variável elemento. Para facilitar toda a explicação eu vou sempre pintar de cinza o LaTeX: v[j] onde eu estou (no caso, o segundo elemento do vetor, 3) e de preto o vetor ainda não ordenado (elementos LaTeX: \geq{}j).

v[1] v[2] v[3] v[4] v[5] v[6]
5 3 7 8 2 5

Então ele me diz que LaTeX: i \leftarrow{} j-1. Portanto, LaTeX: i=1. E agora ele me faz um enquanto (que poderia ser substituído por para) onde meu i deverá ir diminuindo. Vamos entrar no loop...

Bom, meu LaTeX: i =1 é maior que 0. LaTeX: v[1]=5 é maior que o LaTeX: elemento=3? Sim, então vamos entrar no corpo do enquanto... Aqui ele me manda fazer um LaTeX: vetor[i+1] = vetor[i], que nesse caso é fazer um LaTeX: v[2]=v[1]=5.

v[1] v[2] v[3] v[4] v[5] v[6]
5 5 7 8 2 5

E agora subtrae de i um valor. Portanto, LaTeX: i=0. Ele retorna ao enquanto, mas agora não satisfazemos a condição LaTeX: i>0, por isso saímos do enquanto. Então ele pede para LaTeX: vetor[i+1]=elemento (LaTeX: v[1]=elemento). Portanto, o vetor fica assim:

v[1] v[2] v[3] v[4] v[5] v[6]
3 5 7 8 2 5

E incrementamos o j, agora LaTeX: j=3.

v[1] v[2] v[3] v[4] v[5] v[6]
3 5 7 8 2 5

LaTeX: elemento = 7

LaTeX: i = 3-1 = 2

LaTeX: i > 0 ... E LaTeX: 5 > 7? Não! Portanto, não entramos no enquanto.

LaTeX: v[3] = elemento (nenhuma mudança)

E lá vamos para LaTeX: j=4 e continuando até que vamos ter o vetor ordenado:

v[1] v[2] v[3] v[4] v[5] v[6]
2 3 5 5 7 8

Qual a lógica?

Como eu já disse na introdução, mas lá sem grandes explicações, a Ordenação por Inserção divide o vetor em dois. O primeiro (de elementos LaTeX: <j) contém todos seus valores ordenados e o segundo (de elementos LaTeX: \geq{}j) contém os valores que devem ser inseridos no primeiro vetor já ordenado (por isso ele se chama Algoritmo de Inserção).

A chave do algoritmo é o enquanto que acontece para ir deslocando todos os elementos para seu índice LaTeX: +1 enquanto o elemento for menor que eles (para depois o elemento ser colocado onde parou).

A variável elemento só serve para não perdermos o valor de LaTeX: v[j] (porque depois fazemos LaTeX: v[i+1]=v[i] quando LaTeX: i=j-1)

Acredito que não tenham restado dúvidas. Dê mais uma olhada no algoritmo e tente implementar. Se tiver dificulade, coloque mensagens de debug estratégicas para entender o algoritmo. (ex.: no início do para coloque para imprimir o valor de j e no início de cada enquanto coloque para imprimir os valores elemento, i e v[i])

Custo

Você deve ter percebido que este algoritmo não tem um custo fixo. Se todo o vetor estiver ordenado, ele nunca precisará iterar o LaTeX: i e portanto será executado bem mais rápido do que se o vetor estiver inteiro em ordem decrescente (quando ele sempre precisará iterar LaTeX: i até o fim - 0). Então, neste artigo, gostaria-lhes de apresentar a análise de algoritmos baseada em casos. Para este programa, dizemos que:

  • Melhor caso é quando todos os elementos já estão ordenados. Custo: LaTeX: \Theta{}(n)
  • Pior caso é quando os elementos estão em ordem decrescente. Custo: LaTeX: \Theta{}(n^{2})

Em alguns programas o caso médio é importante também, mas não é o caso da ordenação por inserção. Vemos que há uma diferença bem grande entre o custo dos dois casos. Por isso, precisamos conhecer onde que nosso algoritmo será implementado e quais as chances de ele ser o melhor ou pior caso. Em geral, o pior caso é o mais comum... Por isso, diremos que o custo deste algoritmo é LaTeX: \Theta{}(n^{2}).

Introdução à Ordenação de Vetores

Monday, January 9th, 2006

O que é um vetor?

Vetor é uma estrutura de dados que serve para substituir várias variáveis. Para um problema pequeno onde desejo armazenar dois inteiros e tirar o MMC deles eu posso usar duas variáveis: n1 e n2. Mas existem casos em que seria um número muito grande de variáveis (e em alguns deles nem sabemos ao certo, porque faremos uma alocação a partir de um número que o usuário pedir), por isso vetores são extremamente úteis.

No que consiste a ordenação?

Os algoritmos de ordenação tem como objetivo permutar uma seqüência LaTeX: n_{1}, n_{2}, n_{3}, \ldots{} de forma que LaTeX: n_{1} \leq{} n_{2} \leq{} n_{3} \leq{} \ldots{}. A ordenação não precisa ser exatamente de um vetor, mas vetor é geralmente a estrutura que usamos para guardar uma lista de números para podermos ordená-los.

Por que ordenar?

Citando o Cormen:

  • Às vezes, a necessidade de ordenar informações é inerente a uma aplicação. Por exemplo, para preparar os extratos de clientes, os bancos precisam ordenar os cheques pelo número do cheque.
  • Os algoritmos freqüentemente usam a ordenação como uma sub-rotina chave. Por exemplo, um programa que apresenta objetos gráficos dispostos em camadas uns sobre os outros talvez tenha de ordenar os objetos de acordo com uma relação "acima", de forma a poder desenhar esses objetos de baixo para cima.
  • Existe uma ampla variedade de algoritmos de ordenação, e eles empregam um rico conjunto de técnicas. De fato, muitas técnicas importantes usadas ao longo do projeto de algoritmos são representadas no corpo de algoritmos de ordenação que foram desenvolvidos ao longo dos anos. Desse modo, a ordenação também é um problema de interesse histórico.

Algoritmos de ordenação

Você encontra nos links a esquerda, logo abaixo do título deste post (Introdução à Ordenação de Vetores)

Para ler o que escrevo atualmente, visite meu novo blog.

Índice

Online Judges

Programming Contests

Sobre o design

Este design foi copiado do CSS Zen Garden e modificado com autorização de seu autor, Gunta Klavina.

Licença

Todo o conteúdo deste site (incluindo textos, imagens, arquivos de áudio e quaisquer outros trabalhos), exceto quando especificado o contrário, está licenciado por Tiago Madeira sob uma Licença Creative Commons que permite que você copie, distribua, exiba, execute a obra e crie obras derivadas desde que mantenha os créditos, não use sua modificação para fins comerciais e compartilhe seu trabalho derivado pela mesma licença.

HTML 4.01 gerado por WordPress em 0.325 segundos.