You are on page 1of 38

Heapsort

Possui o mesmo princpio de funcionamento da ordenao por seleo. Algoritmo:


1. Selecione o menor item do vetor. 2. Troque-o com o item da primeira posio do vetor. 3. Repita estas operaes com os n 1 itens restantes, depois com os n 2 itens, e assim sucessivamente.

O custo para encontrar o menor (ou o maior) item entre n itens n 1 comparaes. Isso pode ser reduzido utilizando uma fila de prioridades.

Algoritmos e Estrutura de Dados II

Heapsort
Filas de Prioridades
uma estrutura de dados onde a chave de cada item reflete a prioridade em tratar aquele item Aplicaes:
SOs usam filas de prioridades, nas quais as chaves representam o tempo em que eventos devem ocorrer. Sistemas de gerncia de memria usam a tcnica de substituir a pgina menos utilizada na memria principal por uma nova pgina. Mtodos numricos iterativos so baseados na seleo repetida de um item com maior (menor) valor.
Algoritmos e Estrutura de Dados II

Heapsort
Filas de Prioridades - Tipo Abstrato de Dados
Operaes:
1. Constri uma fila de prioridades a partir de um conjunto com n itens. 2. Informa qual o maior item do conjunto. 3. Retira o item com maior chave. 4. Insere um novo item. 5. Aumenta o valor da chave do item i para um novo valor que maior que o valor atual da chave. 6. Substitui o maior item por um novo item, a no ser que o novo item seja maior. 7. Altera a prioridade de um item. 8. Remove um item qualquer. 9. Ajunta duas filas de prioridades em uma nica.

Algoritmos e Estrutura de Dados II

Heapsort
Filas de Prioridades Representao
Representao atravs de uma lista linear ordenada:
Neste caso, Constri leva tempo O(n log n). Insere O(n). Retira O(1).

Representao atravs de uma lista linear no ordenada:


Neste caso, Constri tem custo linear. Insere O(1). Retira O(n). Algoritmos e Estrutura de Dados II

Heapsort
Filas de Prioridades Representao
A melhor representao atravs de uma estruturas de dados chamada heap:
Neste caso, Constri O(nlogn). Insere, Retira, Substitui e Altera so O(log n).

Algoritmos e Estrutura de Dados II

Heapsort
Filas de Prioridades - Algoritmos de Ordenao
As operaes das filas de prioridades podem ser utilizadas para implementar algoritmos de ordenao. Basta utilizar repetidamente a operao Insere para construir a fila de prioridades. Em seguida, utilizar repetidamente a operao Retira para receber os itens na ordem reversa. O uso de listas lineares no ordenadas corresponde ao mtodo da seleo. O uso de listas lineares ordenadas corresponde ao mtodo da insero. O uso de heaps corresponde ao mtodo Heapsort.
Algoritmos e Estrutura de Dados II

Heapsort
Heaps

uma seqncia de itens com chaves c[1], c[2], ... , c[n], tal que, para todo i = 1, 2, ..., n/2 :

c[i] >= c[2i],

c[i] >= c[2i + 1],

Algoritmos e Estrutura de Dados II

Heapsort
Essa definio pode ser facilmente visualizada em uma rvore binria completa:

rvores vo ser vistas em detalhes nos algoritmos de pesqusia

Algoritmos e Estrutura de Dados II

Heapsort
Heaps
rvore binria completa:
Os ns so numerados de 1 a n. O primeiro n chamado raiz. O n k/2 o pai do n k, para 1 < k <= n. Os ns 2k e 2k + 1 so os filhos esquerda e direita do n k, para 1 <= k <= n/2.

Algoritmos e Estrutura de Dados II

Heapsort
Heaps
As chaves na rvore satisfazem a condio do heap. A chave em cada n maior do que as chaves em seus filhos. A chave no n raiz a maior chave do conjunto. Uma rvore binria completa pode ser representada por um array:

Algoritmos e Estrutura de Dados II

Heapsort
Heaps
A representao extremamente compacta. Permite caminhar pelos ns da rvore facilmente. Os filhos de um n i esto nas posies 2i e 2i + 1. O pai de um n i est na posio i div 2. Na representao do heap em um arranjo, a maior chave est sempre na posio 1 do vetor. Os algoritmos para implementar as operaes sobre o heap operam ao longo de um dos caminhos da rvore. Um algoritmo elegante para construir o heap foi proposto por Floyd em 1964.
Algoritmos e Estrutura de Dados II

Heapsort
Construo dos Heaps
O algoritmo no necessita de nenhuma memria auxiliar. Dado um vetor A[1], A[2], ..., A[n], os itens A[n/2 + 1], A[n/2 + 2], ..., A[n] formam um heap:
Neste intervalo no existem dois ndices i e j tais que j = 2i ou j = 2i + 1.
Algoritmos e Estrutura de Dados II

Heapsort
Heaps
Algoritmo:

Algoritmos e Estrutura de Dados II

Heapsort
Heaps
Os itens de A[4] a A[7] formam um heap. O heap estendido para a esquerda (Esq = 3), englobando o item A[3], pai dos itens A[6] e A[7]. A condio de heap violada:
O heap refeito trocando os itens D e S.

O item R incluindo no heap (Esq = 2), o que no viola a condio de heap. O item O incluindo no heap (Esq = 1). A Condio de heap violada:
O heap refeito trocando os itens O e S, encerrando o processo.
Algoritmos e Estrutura de Dados II

Heapsort
Programa para refazer a condio de heap:
void Refaz(Indice Esq, Indice Dir, Item *A) { Indice i = Esq; int j; Item x; j = i * 2; x = A[i]; while (j <= Dir) { if (j < Dir) { if (A[j].Chave < A[j+1].Chave) j++; } if (x.Chave >= A[j].Chave) break; A[i] = A[j]; i = j; j = i *2; } A[i] = x; Algoritmos e Estrutura de Dados II }

Heapsort
Programa para construir o heap:
void Constroi(Item *A, Indice n) { Indice Esq; Esq = n / 2 + 1; while (Esq > 1) { Esq--; Refaz(Esq, n, A); } }

Algoritmos e Estrutura de Dados II

Heapsort
Programa que implementa a operao de retirar o item com maior chave: Item RetiraMax(Item *A, Indice *n) { Item Maximo; if (*n < 1) printf(Erro: heap vazio\n); else { Maximo = A[1]; A[1] = A[*n]; (*n)--; Refaz(1, *n, A); } return Maximo; Algoritmos e Estrutura de Dados II }

Heapsort
Algoritmo:
1. Construir o heap. 2. Troque o item na posio 1 do vetor (raiz do heap) com o item da posio n. 3. Use o procedimento Refaz para reconstituir o heap para os itens A[1], A[2], ..., A[n - 1]. 4. Repita os passos 2 e 3 com os n - 1 itens restantes, depois com os n - 2, at que reste apenas um item.

Algoritmos e Estrutura de Dados II

Heapsort
Exemplo de aplicao do Heapsort:

Algoritmos e Estrutura de Dados II

Heapsort
O caminho seguido pelo procedimento Refaz para reconstituir a condio do heap est em negrito. Por exemplo, aps a troca dos itens S e D na segunda linha da Figura, o item D volta para a posio 5, aps passar pelas posies 1 e 2.
Algoritmos e Estrutura de Dados II

Heapsort
Programa que mostra a implementao do Heapsort:
/* -- Entra aqui a funo Refaz -- */ /* -- Entra aqui a funo Constroi -- */ void Heapsort(Item *A, Indice *n) { Indice Esq, Dir; Item x; Constroi(A, n); /* constroi o heap */ Esq = 1; Dir = *n; while (Dir > 1) { /* ordena o vetor */ x = A[1]; A[1] = A[Dir]; A[Dir] = x; Dir--; Refaz(Esq, Dir, A); } Algoritmos e Estrutura de Dados II }

Heapsort
Anlise
O procedimento Refaz gasta cerca de log n operaes, no pior caso. Logo, Heapsort gasta um tempo de execuo proporcional a n log n, no pior caso.

Algoritmos e Estrutura de Dados II

Heapsort
Vantagens:
O comportamento do Heapsort sempre O(n log n), qualquer que seja a entrada.

Desvantagens:
O anel interno do algoritmo bastante complexo se comparado com o do Quicksort. O Heapsort no estvel.

Recomendado:
Para aplicaes que no podem tolerar eventualmente um caso desfavorvel. No recomendado para arquivos com poucos registros, por causa do tempo necessrio para construir o heap.
Algoritmos e Estrutura de Dados II

Comparao entre os Mtodos


Complexidade:

Apesar de no se conhecer analiticamente o comportamento do Shellsort, ele considerado um mtodo eficiente.


Algoritmos e Estrutura de Dados II

Comparao entre os Mtodos


Tempo de execuo:
Observao: O mtodo que levou menos tempo real para executar recebeu o valor 1 e os outros receberam valores relativos a ele. Registros na ordem aleatria:

Algoritmos e Estrutura de Dados II

Comparao entre os Mtodos


Tempo de Execuo
Registros na ordem ascendente:

Algoritmos e Estrutura de Dados II

Comparao entre os Mtodos


Tempo de Execuo
Registros na ordem descendente:

Algoritmos e Estrutura de Dados II

Comparao entre os Mtodos


Observaes sobre os mtodos:

1. Shellsort, Quicksort e Heapsort tm a mesma ordem de grandeza. 2. O Quicksort o mais rpido para todos os tamanhos aleatrios experimentados. 3. A relao Heapsort/Quicksort se mantm constante para todos os tamanhos. 4. A relao Shellsort/Quicksort aumenta medida que o nmero de elementos aumenta.

Algoritmos e Estrutura de Dados II

Comparao entre os Mtodos


Observaes sobre os mtodos:

5. Para arquivos pequenos (500 elementos), o Shellsort mais rpido que o Heapsort. 6. Quando o tamanho da entrada cresce, o Heapsort mais rpido que o Shellsort. 7. O Insero o mais rpido para qualquer tamanho se os elementos esto ordenados. 8. O Insero o mais lento para qualquer tamanho se os elementos esto em ordem descendente. 9. Entre os algoritmos de custo O(n2), o Insero melhor para todos os tamanhos aleatrios Algoritmos e Estrutura de Dados II experimentados.

Comparao entre os Mtodos


Influncia da ordem inicial do registros:

Algoritmos e Estrutura de Dados II

Comparao entre os Mtodos


Influncia da ordem inicial do registros:
1. O Shellsort bastante sensvel ordenao ascendente ou descendente da entrada. 2. Em arquivos do mesmo tamanho, o Shellsort executa mais rpido para arquivos ordenados. 3. O Quicksort sensvel ordenao ascendente ou descendente da entrada. 4. Em arquivos do mesmo tamanho, o Quicksort executa mais rpido para arquivos ordenados. 5. O Quicksort o mais rpido para qualquer tamanho para arquivos na ordem ascendente. 6. O Heapsort praticamente no sensvel ordenao da entrada.
Algoritmos e Estrutura de Dados II

Comparao entre os Mtodos


Mtodo da Insero:
o mais interessante para arquivos com menos do que 20 elementos. O mtodo estvel. Possui comportamento melhor do que o mtodo da bolha (Bubblesort) que tambm estvel. Sua implementao to simples quanto as implementaes do Bubblesort e Seleo. Para arquivos j ordenados, o mtodo O(n). O custo linear para adicionar alguns elementos a um arquivo j ordenado.
Algoritmos e Estrutura de Dados II

Comparao entre os Mtodos


Mtodo da Seleo:
vantajoso quanto ao nmero de movimentos de registros, que O(n). Deve ser usado para arquivos com registros muito grandes, desde que o tamanho do arquivo no exceda 1.000 elementos.

Algoritmos e Estrutura de Dados II

Comparao entre os Mtodos


Shellsort:
o mtodo a ser escolhido para a maioria das aplicaes por ser muito eficiente para arquivos de tamanho moderado. Mesmo para arquivos grandes, o mtodo cerca de apenas duas vezes mais lento do que o Quicksort. Sua implementao simples e geralmente resulta em um programa pequeno. No possui um pior caso ruim e quando encontra um arquivo parcialmente ordenado trabalha menos.
Algoritmos e Estrutura de Dados II

Comparao entre os Mtodos


Quicksort:
o algoritmo mais eficiente que existe para uma grande variedade de situaes. um mtodo bastante frgil no sentido de que qualquer erro de implementao pode ser difcil de ser detectado. O algoritmo recursivo, o que demanda uma pequena quantidade de memria adicional. Seu desempenho da ordem de O(n2) operaes no pior caso. O principal cuidado a ser tomado com relao escolha do piv. A escolha do elemento do meio do arranjo melhora muito o desempenho quando o arquivo est total ou parcialmente ordenado. O pior caso tem uma probabilidade muito remota de ocorrer quando os elementos forem aleatrios.
Algoritmos e Estrutura de Dados II

Comparao entre os Mtodos


Quicksort:
Geralmente se usa a mediana de uma amostra de trs elementos para evitar o pior caso. Esta soluo melhora o caso mdio ligeiramente. Outra importante melhoria para o desempenho do Quicksort evitar chamadas recursivas para pequenos subarquivos. Para isto, basta chamar um mtodo de ordenao simples nos arquivos pequenos. A melhoria no desempenho significativa, podendo chegar a 20% para a maioria das aplicaes (Sedgewick, 1988).
Algoritmos e Estrutura de Dados II

Comparao entre os Mtodos


Heapsort:
um mtodo de ordenao elegante e eficiente. No necessita de nenhuma memria adicional. Executa sempre em tempo proporcional a n log n. Aplicaes que no podem tolerar eventuais variaes no tempo esperado de execuo devem usar o Heapsort.

Algoritmos e Estrutura de Dados II

Comparao entre os Mtodos


Consideraes finais:
Para registros muito grandes desejvel que o mtodo de ordenao realize apenas n movimentos dos registros. Com o uso de uma ordenao indireta possvel se conseguir isso. Suponha que o arquivo A contenha os seguintes registros: A[1], A[2], ..., A[n]. Seja P um arranjo P[1], P[2], ..., P[n] de apontadores. Os registros somente so acessados para fins de comparaes e toda movimentao realizada sobre os apontadores. Ao final, P[1] contm o ndice do menor elemento de A, P[2] o ndice do segundo menor e assim sucessivamente. Essa estratgia pode ser utilizada para qualquer dos mtodos de ordenao interna. Algoritmos e Estrutura de Dados II

You might also like