You are on page 1of 19

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

183

Captulo 8 - Algoritmos de Ordenao

Objetivos Apresentar algoritmos para ordenao em memria principal; Estudar a complexidade destes algoritmos. Ordenao interna Ordenar como se chama o processo de rearranjar um conjunto de objetos em uma ordem ascendente ou descendente, com o objetivo de facilitar a sua recuperao posterior. Chama-se ordenao interna o mtodo no qual o arquivo a ser ordenado cabe inteiramente na memria principal A maioria dos mtodos de ordenao baseada em comparaes das chaves. H mtodos que utilizam o princpio da distribuio.

Critrios para a escolha de um algoritmo de ordenao : tempo gasto para ordenar um arquivo as medidas de complexidade relevantes contam o nmero de comparaes entre chaves e o nmero de trocas (movimentaes) de itens; estabilidade um mtodo de ordenao dito ser estvel se a ordem relativa dos itens com chaves iguais se mantiver inalterada durante o processo de ordenao; espao auxiliar necessrio; simplicidade para implementao os mtodos de ordenao interna so classificados em : mtodos simples programas pequenos e fceis de entender : O (n2) mtodos eficientes: O (n log (n) )

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

184

Mtodo da Bolha (Bubblesort) O mtodo da Bolha (bubblesort) um dos mais simples e estveis, podendo ser descrito, em linguagem C++, como : void Bubblesort ( TipoItem Vet [ ], int N ) { int I, J; TipoItem Aux; for ( I = 1; I <= N - 1; I ++ ) for ( J = N; J > I; J -- ) if ( Vet [ J ] < Vet [ J - 1 ] ) { Aux = Vet [ J - 1 ]; Vet [ J - 1] = Vet [ J ]; Vet [ J ] = Aux; } } Anlise de complexidade : Nmero de comparaes:

n2 n melhor = pior = caso mdio = = O (n2) 2 2


Nmero de movimentaes: melhor caso = pior caso caso mdio = = 0
n 2 n 1 i=0 j =i + 1

= O(1)

3 = O (n2)
O (n2)

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

185

Exemplo : Aplicao do mtodo para ordenar a palavra : COMPUTAR.

00 01 02 03 04 05 06 07

1 C A A A A A A A

2 O C C C C C C C

3 M M M M M M M M

4 P O O O O O O O

5 U P P P P P P P

6 T R R R R R R R

7 A U T T T T T T

8 R T U U U U U U

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

186

Mtodo de Seleo O mtodo de seleo simples, indicado para vetores com registros grandes, embora no teste se o vetor j est ordenado. No estvel. Pode ser descrito, em linguagem C++, como : void Selecao ( TipoItem Vet [ ], int N ) { int I, J, Min; TipoItem Aux; for ( I = 1; I <= N - 1; I ++ ) { Min = I; for ( J = I + 1; J <= N; J++ ) if ( Vet [ J ] < Vet [ Min ] ) Min = J; Aux = Vet [ Min ]; Vet [ Min ] = Vet [ I ]; Vet [ I ] = Aux; } } Anlise de complexidade : Nmero de comparaes:

n2 n melhor = pior = caso mdio = = O (n2) 2 2


Nmero de movimentaes: melhor = pior = caso mdio =
n 2 i=0

3 = 3 (n-1) = O (n)

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

187

Exemplo : Aplicao do mtodo para ordenar a palavra : COMPUTAR.

00 01 02 03 04 05 06 07

1 C A A A A A A A

2 O O C C C C C C

3 M M M M M M M M

4 P P P P O O O O

5 U U U U U P P P

6 T T T T T T R R

7 A C O O P U U T

8 R R R R R R T U

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

188

Mtodo de Insero O mtodo de insero simples e estvel, indicado para vetores quase ordenados. Pode ser descrito, em linguagem C++, como : void Insercao ( TipoItem Vet [ ], int N ) { int I, J; TipoItem Aux; for ( I = 2; I <= N; I ++) { Aux = Vet [ I ]; Vet [ 0 ] = Aux; for ( J = I - 1; Aux < Vet [ J ]; J -- ) Vet [ J+1 ] = Vet [ J ]; Vet [ J + 1 ] = Aux; } } Anlise de complexidade : Nmero de comparaes: melhor caso (vetor j ordenado) = n - 1 = O (n) n2 n pior caso (vetor na ordem inversa) = + 1 = O (n2) 2 2 2 n 3n caso mdio = + 1 = O (n2) 4 4 Nmero de movimentaes: melhor caso = 3 (n-1) = O (n) 2 n 5n + 3 = O (n2) pior caso = 2 2 n 2 11n caso mdio = + 3 = O (n2) 4 4

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

189

Exemplo : Aplicao do mtodo para ordenar a palavra : COMPUTAR.

00 01 02 03 04 05 06 07

1 C C C C C C A A

2 O O O M M M C C

3 M M M O O O M M

4 P P P P P P O O

5 U U U U U T P P

6 T T T T T U T R

7 A A A A A A U T

8 R R R R R R R U

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

190

Shellsort O princpio deste mtodo o de comparar elementos que estejam a uma determinada distncia um do outro, reduzindo-a at ser unitria. Cada incremento no deve ser mltiplo do anterior. Seu cdigo pequeno e sensvel ordem inicial. No estvel. Pode ser descrito, em linguagem C++, como: void shellsort ( TipoItem Vet [ ], int N ) { int H, I, J; TipoItem Aux; for ( H = 1; H <= N / 9; H = 3 * H + 1 ); while ( H > 0 ) { for ( I = H + 1; I <= N; I ++ ) { Aux = Vet [ I ]; J = I; while ( J > H && Vet [ J - H ] > Aux ) { Vet [ J ] = Vet [ J - H ]; J = J - H; } Vet [ J ] = Aux; } H = H / 3; } } Anlise de complexidade : Em aberto : O (n1,25) ? O (nlog2n) ?

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

191

Exemplo : Aplicao do mtodo para ordenar a palavra : COMPUTAR.

00 01 02 03 04 05 06

1 C C C C C A A

2 O M M M M C C

3 M O O O O M M

4 P P P P P O O

5 U U U U T P P

6 T T T T U T R

7 A A A A A U T

8 R R R R R R U

Seqncias recomendadas: 3 hk + 1 = 1, 4, 13, 40, 121 2 hk + 1 = 1, 3, 7, 15, 31 Seqncia no recomendada: 2k

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

192

Quicksort um mtodo baseado na estratgia "dividir para conquistar". Dependente da escolha do piv (pior caso), sugere-se escolher trs itens quaisquer e usar a mediana deles como piv. Em seguida, separam-se os elementos menores que ele ( esquerda) dos maiores ( direita). Repetindo-se o processo para cada uma dos grupos formados. Para a maioria das aplicaes bastante eficiente, embora necessite memria e tempo extra para recursividade. No estvel. Algoritmo de partio: 1. Escolher um item X do vetor como piv. 2. Encontrar o elemento de posio I, mais esquerda, que seja maior ou igual a X. 3. Encontrar o elemento de posio J, mais direita, que seja menor ou igual a X. 4. Trocar Vet [ I ] com Vet [ J ]. 5. Repetir os passos de 2 a 4 at que I > J. Exemplo com os pivs marcados para cada partio: Aplicao do mtodo para ordenar a palavra : COMPUTAR. 1 C C C C C A A A A A 2 O O O A A C C C C C 3 M M M M M M M M M M 4 P A A O O O O O O O 5 U U U U U U U R R P 6 T T T T T T T T T R 7 A P P P P P P P P T 8 R R R R R R R U U U

00 01 02 03 04 05 06 07 08 09

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

193

Pode ser descrito, em linguagem C++, como : void Quicksort ( TipoItem Vet [ ], int N ) { OrdenaQS ( Vet, 1, N ); } void OrdenaQS ( TipoItem Vet [ ], int Esq, int Dir ) { int I, J; Particao ( Vet, Esq, Dir, I, J ); if ( Esq < J ) OrdenaQS ( Vet, Esq, J ); if ( I < Dir ) OrdenaQS ( Vet, I , Dir ); } void Particao ( TipoItem Vet [ ], int Esq, int Dir, int & I, int & J ) { TipoItem Pivo, Temp; Pivo = Vet [ ( Esq + Dir ) / 2 ]; I = Esq; J = Dir; do { while ( Vet [ I ] < Pivo ) I ++; while ( Vet [ J ] > Pivo ) J --; if ( I <= J ) { Temp = Vet [ I ]; Vet [ I ] = Vet [ J ]; Vet [ J ] = Temp; I ++ ; J -- ; } } while ( I <= J ); }

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

194

Anlise de complexidade: Sejam T(0) = T(1) = 1 T(n) = n + T(i-1) + T(n-i) i = posio do piv seja

considerando que um tempo de partio seja O(n) , no melhor caso: T(n) = 2 T(n/2) + n = 2 [2 T(n/4)+(n/2)] + n = 22 T (n/22) + 2 n T(n) = 2 { 2 [2 T(n/8)+(n/4)] + (n/2) }+ n = 23 T (n/23) + 3 n generalizando T(n) = 2i T (n/2i) + i n e fazendo i = lg (n) T(n) = 2lg(n) T (1) + n lg (n) = n + n lg (n) O (n lg (n)) no pior caso (caso o piv esteja na primeira ou na ltima posio): T(n) = n + T(n-1) = n + (n-1) + T(n-2) = n + (n-1) + (n-2) + + 2 + 1 = (1/2) [n (n+1)] O (n2) para o caso mdio, com igual probabilidade para qualquer posio:
T(n) = n + 1 n 2 T(i 1) + T(n - i) ]= n + T(i 1) [ n i =1 n

multiplicando por n e substituindo n por (n-1)


n T(n) = n 2 + 2 T(i 1)
i =1 n

(n - 1) T(n - 1) = (n - 1) 2 + 2 T(i 1)
i =1

n 1

subtraindo as duas equaes: n T(n) - (n-1) T(n-1) = n2 - (n-1) 2 - 2 T(n-1) n T(n) = (n+1) T(n-1) + 2 n - 1

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

195

dividindo por (n+1) e desprezando a constante (-1) [1/(n+1)] T(n) (1/n) T(n-1) + (2/n) + 1 substituindo [1/(n+1)] T(n) por t(n) e desprezando a constante t(n) t(n-1) + (2/n) t(n) { t(n-2) + [2/(n-1)] } + (2/n) pode ser expandido t(n) { 2 [ 1 + 1/2 + 1/3 + + 1/n ] } 2 log (n) voltando t(n) = O ( log(n) ) logo T(n) = (n+1) O (log (n) ) = O ( n log (n) )

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

196

Heapsort Este mtodo ideal para arquivos grandes. lento em comparao com o Quicksort (aproximadamente duas vezes). No entanto, seu comportamento no sensvel entrada. No estvel. Definies: fila de prioridades: Tipo Abstrado de Dados (TAD) onde o primeiro elemento a ser removido o que possui maior (ou menor) chave. heap: representao de uma fila de prioridades como rvore binria parcialmente ordenada, onde a chave de um nodo maior ou igual s chaves dos filhos, se existirem. Algoritmo de ordenao : 1. Trocar o primeiro elemento com o n-simo. 2. Refazer o heap entre 1 e (n - 1) . 3. Repetir os passos 1 e 2 at que todos os elementos tenham sido trocados. Exemplo : Aplicao do mtodo para ordenar a palavra : COMPUTAR. 1 C C C U T R P O M C A 2 O O U R R P O C C A C 3 M T T T M M M M A M M 4 P R R P P A A A O O O 5 U U O O O O C P P P P 6 T M M M C C R R R R R 7 A A A A A R T T T T T 8 R P P C U U U U U U U

00 01 02 03 04 05 06 07 08 09 10

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

197

Configurao inicial do heap : C O P R Configurao final do heap : A C O U Pode ser descrito, em linguagem C++, como : void Refazer ( int Esq, int Dir, TipoItem Vet [ ] ) { int I, J; TipoItem Aux; I = Esq; J = I * 2; Aux = Vet [ I ]; while ( J <= Dir) { if ( J < Dir && Vet [ J ] < Vet [ J + 1 ] ) J ++; if ( Aux >= Vet [ J ] ) J = Dir + 1; // para sair da repetio (break) else { Vet [ I ] = Vet [ J ]; I = J; J = I * 2; } } Vet [ I ] = Aux; } P R M T U T M A

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

198

void Heapsort ( TipoItem Vet [ ], int N ) { int Esq, Dir = N; TipoItem Aux; // construir o heap for ( Esq = N / 2; Esq >= 1; Esq -- ) refazer ( Esq, Dir, Vet ); // ordenar o vetor while ( Dir > 1 ) { Aux = Vet [ 1 ]; Vet [ 1 ] = Vet [ Dir ]; Vet [ Dir ] = Aux; Dir --; refazer ( 1, Dir, Vet ); } } Anlise de complexidade : melhor = pior = caso mdio = O ( n lg (n) ) O procedimento refazer ( ) gasta cerca de lg (n) operaes, no pior caso.

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

199

Comparao entre mtodos Tabelas comparativas (menor tempo real tem valor igual a1) : (fonte ZIVIANI, pg. 88) Ordem aleatria dos registros 500 11.3 16.2 1.2 1 1.5 5000 87 124 1.6 1 1.6 10000 161 228 1.7 1 1.6 30000 2 1 1.6

Insero Seleo Shellsort Quicksort Heapsort Registros ordenados

Insero Seleo Shellsort Quicksort Heapsort

500 1 128 3.9 4.1 12.2

5000 1 1524 6.8 6.3 20.8

10000 1 3066 7.3 6.8 22.4

30000 1 8.1 7.1 24.6

Ordem decrescente dos registros 500 40.3 29.3 1.5 1 2.5 5000 305 221 1.5 1 2.7 10000 575 417 1.6 1 2.7 30000 1.6 1 2.9

Insero Seleo Shellsort Quicksort Heapsort

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

200

Exerccios propostos 01. Fazer um programa para implementar o mtodo Quicksort, combinado com o Bubblesort para completar a operao. 02. Fazer um programa para implementar o mtodo Quicksort, combinado com o de seleo, quando o tamanho da parte a ser ordenada for menor que 16 elementos. 03. Fazer um programa para implementar os mtodos Shellsort, Quicksort e Heapsort, comparando-os com uma massa de dados, uma parte ordenada ascendentemente, uma parte aleatria e outra ordenada descendentemente. 04. Fazer um programa para implementar o mtodo Bubblesort em uma lista de nmeros inteiros em memria dinmica. Gerar dados aleatrios. Usar arquivos binrios. 05. Fazer um programa para implementar o mtodo de Seleo em uma lista de nmeros inteiros em memria dinmica. Gerar dados aleatrios. Usar arquivos binrios. 06. Fazer um programa para implementar o mtodo de Insero em uma lista de nmeros inteiros em memria dinmica. Gerar dados aleatrios. Usar arquivos binrios. 07. Fazer um programa para implementar o mtodo Quicksort, sem recursividade, usando uma pilha de inteiros. 08. Fazer um programa para implementar um mtodo de ordenao por distribuio de palavras em listas menores organizadas pelas primeiras letras, depois pelas segundas letras e assim por diante. 09. Fazer um programa para implementar os mtodos Shellsort, Quicksort e Heapsort, comparando-os graficamente com uma massa de dados que gere o nmero de comparaes para vetores de tamanho igual a 16, 64, 128, 256, 512 e 1024 gerados aleatoriamente. 10. Fazer um programa para ordenar um arquivo de inteiros usando um vetor com tamanho aproximadamente igual a 1/4 do tamanho do arquivo original. Usar arquivos binrios. 11. Fazer um programa para implementar o seguinte algoritmo de ordenao: 1.) se houver pelo menos dois elementos ainda no testados em um vetor de inteiros, test-los para ver se esto ordenados em ordem crescente; 2.) se no estiver, trocar os elementos de posio, voltar uma posio e repetir a ao anterior. 12. Refazer o algoritmo anterior utilizando uma lista duplamente encadeada.

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

201

13. Modificar o mtodo Quicksort para usar a mediana entre trs valores (a, b e c, tais que a b c) escolhidos aleatoriamente em um vetor de reais. Comparar o seu desempenho com o mtodo que usa o valor mdio entre os mesmos trs valores. 14. Fazer um programa para implementar o seguinte algoritmo de ordenao para ordem crescente: 1.) determinar o menor e o maior elemento de um vetor de reais; 2.) coloc-los na primeira e na ltima posies, respectivamente 3.) repetir as aes anteriores, para os elementos e posies restantes.

Direitos reservados para uso da PUC-Minas / Instituto de Informtica

You might also like