• Nenhum resultado encontrado

Ordena¸ c˜ ao em vetores

No documento Algoritmos e Estruturas de Dados I (páginas 160-164)

Estruturas de dados

10.1. VETORES 139 programa¸c˜ ao que implementa a no¸c˜ ao de vetores tem que encontrar uma maneira para

10.1.4 Ordena¸ c˜ ao em vetores

Ordenar vetores ´e extremamente importante em computa¸c˜ao, pois ´e muito comum que uma sa´ıda de um programa seja dado com algum tipo de ordem sobre os dados.

Nesta se¸c˜ao vamos apresentar dois algoritmos para este problema: os m´etodos da ordena¸c˜ao por sele¸c˜ao e por inser¸c˜ao.

Ordena¸c˜ao por sele¸c˜ao

A ordena¸c˜ao por sele¸c˜ao ´e um m´etodo bastante simples de se compreender e tamb´em de se implementar.

O princ´ıpio ´e selecionar os elementos corretos para cada posi¸c˜ao do vetor, da´ı o nome do m´etodo. Para um vetor de N elementos, existem N −1 etapas. Em cada etapai o i-´esimo menor elemento ´e selecionado e colocado na posi¸c˜aoi.

Assim, na primeira etapa, o menor elemento de todos ´e localizado (selecionado) e colocado na primeira posi¸c˜ao do vetor. Na segunda etapa localiza-se o segundo menor e coloca-se na segunda posi¸c˜ao, e assim por diante, at´e que, por fim, o pen´ultimo menor elemento (isto ´e, o segundo maior) ´e colocado na pen´ultima posi¸c˜ao. Con-sequentemente, como j´a temos N −1 elementos em seus devidos lugares, o ´ultimo tamb´em est´a. Vejamos um exemplo de um vetor com 10 elementos.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 . . . 197 198 199 200

15 12 27 23 7 2 0 18 19 21 ? ? ? ? ? . . . ? ? ? ?

Para localizarmos o menor elemento, que ´e o zero que est´a na posi¸c˜ao 7 do vetor, s´o h´a uma maneira, que ´e percorrer todo o vetor e localizar o menor. Este deve ser colocado na primeira posi¸c˜ao. Este ´ultimo (o 15), por sua vez, deve ser trocado de posi¸c˜ao com o da posi¸c˜ao 7. Por isto a busca pelo menor deve nos retornar o ´ındice do menor elemento e n˜ao o elemento em s´ı. O resultado da primeira etapa deste processo est´a mostrado na figura abaixo, com destaque para os elementos trocados.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 . . . 197 198 199 200

0 12 27 23 7 2 15 18 19 21 ? ? ? ? ? . . . ? ? ? ?

Neste ponto precisamos do segundo menor. Por constru¸c˜ao l´ogica do algoritmo, basta percorrer o vetor a partir da segunda posi¸c˜ao, pois o primeiro j´a est´a em seu lugar. O menor de todos agora ´e o 2, que est´a na posi¸c˜ao 6. Basta troc´a-lo pelo segundo elemento, que ´e o 12. E o processo se repete:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 . . . 197 198 199 200

0 2 27 23 7 12 15 18 19 21 ? ? ? ? ? . . . ? ? ? ?

0 2 7 23 27 12 15 18 19 21 ? ? ? ? ? . . . ? ? ? ?

0 2 7 12 27 23 15 18 19 21 ? ? ? ? ? . . . ? ? ? ?

0 2 7 12 15 23 27 18 19 21 ? ? ? ? ? . . . ? ? ? ?

0 2 7 12 15 18 27 23 19 21 ? ? ? ? ? . . . ? ? ? ?

0 2 7 12 15 18 19 23 27 21 ? ? ? ? ? . . . ? ? ? ?

0 2 7 12 15 18 19 21 27 23 ? ? ? ? ? . . . ? ? ? ?

0 2 7 12 15 18 19 21 23 27 ? ? ? ? ? . . . ? ? ? ?

10.1. VETORES 161

procedure selecao (var v : vetor r ; n: integer) ; var i , j , pos menor : integer; aux : real;

begin

for i := 1 to n−1do begin

(∗ acha a posicao do menor a partir de i ∗) pos menor:= i ;

for j:= i+1 to n do (∗ inicia a partir de i+1 ∗) i f v [ j ] < v [ pos menor ] then

pos menor:= j ;

aux:= v [ pos menor ] ; (∗ troca os elementos ∗) v [ pos menor]:= v [ i ] ;

v [ i ]:= aux ; end;

end;

Figura 10.24: M´etodo de ordena¸c˜ao por sele¸c˜ao.

A figura 10.24 mostra a vers˜ao emPascal deste algoritmo.

Este algoritmo tem algumas particularidades dignas de nota. A primeira ´e que, em cada etapa i, a ordena¸c˜ao dos primeiros i−1 elementos ´e definitiva, isto ´e, constitui a ordena¸c˜ao final destes primeiros ielementos do vetor.

A segunda ´e que a busca pelo menor elemento em cada etapa i exige percorrer um vetor de N −i elementos. Como isto ´e feito N vezes, ent˜ao o n´umero de com-para¸c˜oes feitas na parte mais interna do algoritmo ´e sempre N(N2−1), o que define um comportamento quadr´atico para as compara¸c˜oes.

A terceira ´e que trocas de posi¸c˜oes no vetor ocorrem no la¸co mais externo, por isto o n´umero total de trocas feitas pelo algoritmo ´e sempre N −1.

Ordena¸c˜ao por inser¸c˜ao

A ordena¸c˜ao por inser¸c˜ao ´e provavelmente a mais eficiente, na pr´atica, que a ordena¸c˜ao por sele¸c˜ao. Por´em, embora o algoritmo em s´ı seja simples, sua implementa¸c˜ao ´e repleta de detalhes. Vamos inicialmente entender o processo.

O princ´ıpio do algoritmo ´e percorrer o vetor e a cada etapa i, o elemento da posi¸c˜ao i ´e inserido (da´ı o nome do m´etodo) na sua posi¸c˜ao correta relativamente quando comparado aos primeiros i−1 elementos.

Para melhor compreens˜ao, faremos a apresenta¸c˜ao de um exemplo sem mostrarmos o vetor, usaremos sequˆencias de n´umeros. Consideremos que a entrada ´e a mesma do exemplo anterior, isto ´e:

15, 12, 27, 23, 7, 2, 0, 18, 19, 21.

Na primeira etapa o algoritmo considera que o primeiro elemento, o 15, est´a na sua posi¸c˜ao relativa correta, pois se considera apenas a primeira posi¸c˜ao do vetor.

Usaremos os negritos para mostrar quais as etapas j´a foram feitas pelo algoritmo.

Na segunda etapa deve-se inserir o segundo elemento em sua posi¸c˜ao relativa cor-reta considerando-se apenas o vetor de tamanho 2. Como o 12 ´e menor que que o 15, deve-se trocar estes elementos de posi¸c˜ao, nos resultando na sequˆencia:

12, 15, 27, 23, 7, 2, 0, 18, 19, 21.

Neste ponto, os elementos 12 e 15 est˜ao em suas posi¸c˜oes relativas corretas considerando-se um vetor de 2 posi¸c˜oes. Agora, deve-se colocar o 27 no vetor de 3 elementos. Mas o 27 j´a est´a em seu lugar relativo, ent˜ao o algoritmo n˜ao faz nada:

12, 15, 27, 23, 7, 2, 0, 18, 19, 21.

Na quarta etapa deve-se inserir o 23 na sua posi¸c˜ao relativa correta considerando-se um vetor de 4 elementos. O 23 tem que estar entre o 15 e o 27:

12, 15, 23, 27, 7, 2, 0, 18, 19, 21.

Na quinta etapa deve-se inserir o 7 na sua posi¸c˜ao relativa a um vetor de 5 ele-mentos. Ele deve ser inserido antes do 12, isto ´e, na primeira posi¸c˜ao:

7, 12, 15, 23, 27, 2, 0, 18, 19, 21.

A situa¸c˜ao para o 2 ´e similar, deve ser inserido antes do 7, isto ´e, no in´ıcio:

2, 7, 12, 15, 23, 27, 0, 18, 19, 21.

Idem para o zero:

0, 2, 7, 12, 15, 23, 27, 18, 19, 21.

Agora ´e a vez de inserirmos o 18, entre o 15 e o 27:

0, 2, 7, 12, 15, 18, 23, 27, 19, 21.

Na pen´ultima etapa inserimos o 19 entre o 18 e o 23:

0, 2, 7, 12, 15, 18, 19, 23, 27, 21.

E por ´ultimo o 21 entre o 19 e o 23:

0, 2, 7, 12, 15, 18, 19, 21, 23, 27.

Esta sequˆencia de N passos ´e de f´acil compreens˜ao. Se fˆossemos executar com um conjunto de cartas na m˜ao, por exemplo, com cartas de baralho, imaginando um ma¸co de cartas virado na mesa, basta pegar as cartas uma a uma e encaixar no lugar certo. As cartas de baralho s˜ao facilmente manipuladas para permitir uma inser¸c˜ao em qualquer posi¸c˜ao.

Infelizmente esta opera¸c˜ao executada em um vetor n˜ao ´e t˜ao simples. Vamos consi-derar como exemplo a etapa 8 acima, isto ´e, inser¸c˜ao do 18 no lugar certo. Retomemos este caso agora considerando um vetor para melhor ilustra¸c˜ao, com destaque para o elemento 18 que deve nesta etapa ser inserido no lugar certo:

10.1. VETORES 163

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 . . . 197 198 199 200

0 2 7 12 15 23 27 18 19 21 ? ? ? ? ? . . . ? ? ? ?

A posi¸c˜ao correta do 18, como vimos, ´e entre o 15 e o 23, isto ´e, na sexta posi¸c˜ao do vetor. Significa que os elementos das posi¸c˜oes 6 e 7 devem ser movidos um para frente para abrir espa¸co no vetor para inser¸c˜ao do 18. Os elementos das posi¸c˜oes 9 em diante n˜ao v˜ao mudar de lugar. Executando esta opera¸c˜ao, e salvando o 18 em alguma vari´avel tempor´aria, obteremos o seguinte vetor:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 . . . 197 198 199 200

0 2 7 12 15 23 23 27 19 21 ? ? ? ? ? . . . ? ? ? ?

Isto ´e, o 27 foi copiado da posi¸c˜ao 7 para a posi¸c˜ao 8 e o 23 foi copiado da posi¸c˜ao 6 para a posi¸c˜ao 7. Na figura acima destacamos os elementos que foram movidos de lugar. Observando que o 23 ficou repetido na posi¸c˜ao 6, o que na pr´atica resultou na posi¸c˜ao 6 livre. Agora basta inserir o 18 a´ı:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 . . . 197 198 199 200

0 2 7 12 15 18 23 27 19 21 ? ? ? ? ? . . . ? ? ? ?

Esta etapa constitui o n´ucleo do algoritmo mostrado na figura 10.25. O la¸co externo apenas garante que esta opera¸c˜ao ser´a executada para todos os elementos das posi¸c˜oes de 1 at´eN.

O la¸co interno foi implementado de tal forma que, ao mesmo tempo em que se localiza o lugar certo do elemento da vez, j´a se abre espa¸co no vetor. O la¸co ´e controlado por dois testes, um deles para garantir que o algoritmo n˜ao extrapole o in´ıcio do vetor, o outro que compara dois elementos e troca de posi¸c˜ao sempre que for detectado que o elemento est´a na posi¸c˜ao incorreta.

procedure insercao (var v : vetor r ; n: integer) ; var i , j : integer;

aux : real; begin

for i := 1 to n do begin

aux:= v [ i ] ;

(∗ abre espaco no vetor enquanto localiza a posicao certa ∗) j:= i 1;

while ( j>= 1) and (v [ j ] >aux) do begin

v [ j+1]:= v [ j ] ; j:= j 1;

end;

v [ j+1]:= aux ; end;

end;

Figura 10.25: M´etodo de ordena¸c˜ao por inser¸c˜ao.

Analisar quantas compara¸c˜oes s˜ao feitas ´e bem mais complicado neste algoritmo, pois isto depende da configura¸c˜ao do vetor de entrada. Neste nosso exemplo, vimos que cada etapa teve um comportamento diferente das outras. Em uma vez o elemento j´a estava em seu lugar. Em duas outras vezes tivemos que percorrer todo o subvetor inicial, pois os elementos deveriam ser o primeiro, em cada etapa.

Aparentemente, no pior caso poss´ıvel, que ´e quando o vetor est´a na ordem inversa da ordena¸c˜ao, haver´a o maior n´umero de compara¸c˜oes, que ´e quadr´atico. Mas, na pr´atica, este algoritmo aparenta ser mais r´apido que o m´etodo da sele¸c˜ao na maior parte dos casos, pois algumas vezes o elemento muda pouco de posi¸c˜ao.4

No documento Algoritmos e Estruturas de Dados I (páginas 160-164)