Академический Документы
Профессиональный Документы
Культура Документы
Heapsort
Ivens Cabral1 , Izabete Lima1 , Ldice Angelina1 , Luiz Pereira1 , Walysson Barbosa1
1
{brunoiivens,izabetelima,lidiceangelina,luizp418,walysson.vital}@gmail.com
1. Introduca o
Em grande parte das aplicaco es atuais se faz necessario que o armazenamento seja feito
de forma que obedeca uma ordem determinada. A soluca o para esse tipo de problema e
o uso de algoritmos voltados para a ordenaca o de dados [Celes 2002]. Esses algoritmos
podem ser caracterizados como algoritmos de ordenaca o interna (ordenaca o efetuada com
a propria sequencia, sem uso de sequencias adicionais), que sao usados em sistemas onde
nao se pode gastar memoria adicional; e algoritmos de ordenaca o externa, que sao usados
quando e possvel o uso de memoria adicional. E no contexto de algoritmos de ordenaca o
interna que o Heapsort se encaixa.
O Heapsort e um algoritmo criado na decada de 1960 por R. W. Floyd e J. W. J.
Williams, e pode se adaptar a diversas situaco es diferentes (e considerado um algoritmo
generalista). Seu uso e mais comum em aplicaco es de medio porte, pois sua execuca o
pode se tornar lenta em aplicaco es maiores.
2. Heapsort
O heapsort e um metodo de ordenaca o que utiliza a abordagem da ordenaca o por seleca o,
a qual pesquisa entre os n elementos a serem ordenados o que precede todos os n
1 elementos. Como a complexidade do selection sort e muito alta (O(n2 )), o metodo
heapsort tenta reduzir esse custo utilizando estruturas de dados do tipo fila de prioridades
[Ziviani et al. 2004].
Figura 2. Representacoes
de um Heap
Algoritmo 1: refazerHeap
Entrada: heap, np, n elementos
Resultado: Dado um no pais, reorganiza as sub a rvores daquele no
inicio
maior = np;
f ilho esq = 2 np;
f ilho dir = f ilho esq + 1;
se (f ilho esq <= n elementos) e
(heap[f ilho esq 1] > heap[np 1]) entao
maior = f ilho esq;
fim
senao se (f ilho dir <= n elementos) e
(heap[f ilho dir 1] > heap[maior 1]) entao
maior = f ilho dir;
fim
se (maior! = raiz) entao
trocar(heap[np], heap[maior]);
ref azerHeap(heap, maior, n elementos);
fim
fin
Algoritmo 2: criarHeap
Entrada: heap, n elementos
Resultado: Estrutura heap reorganizada
inicio
n pais = n elementos/2;
enquanto n pais > 0 faca
n pais = n pais 1;
ref azerHeap(heap, n pais, n elementos);
fim
fin
2.3. O Algoritmo
Algoritmo 3: heapsort
Entrada: heap, n elementos
Resultado: Ordena estrutura heap
inicio
criarHeap(heap, n elementos);
enquanto n elementos > 1 faca
trocar(heap[0], heap[n elementos 1]);
n elementos = n elementos 1;
ref azerHeap(heap, 0, n elementos);
fim
fin
Explicaca o do algoritmo 3:
1. A funca o heapsort recebe como parametros a estrutura heap a ser ordenada e a
quantidade de elementos desse heap.
2. Uma chamada e feita a` funca o criarHeap, a qual reorganizara o heap.
3. Apos a reorganizaca o, o maior elemento e colocado no final do array.
4. Entao, a funca o refazerHeap e chamada para os elementos restantes.
5. O passo 4 e repetido ate que todos os elementos estejam ordenados.
2.4. Analise de Complexidade
Para analisar a complexidade do algoritmo Heapsort, temos que primeiro analisar os primeiros dois algoritmos que o compoem.
2.4.1. refazerHeap
O tempo de execuca o do algoritmo sem recursao e constante, portanto sua complexidade
e O(1). Enquanto que para saber a complexidade da parte recursiva de refazerHeap,
precisa-se utilizar a altura da sub a rvore que sera refeita. O maximo de altura de uma suba rvore e 2/3. Entao, para uma a rvore de n elementos, a funca o recursiva consumira um
tempo T (2n/3) para executar. A equaca o de recorrencia obtida neste caso sera T (n) <=
T (2n/3) + O(1).
Pelo Teorema Master [Nonato 2003]
T (n) = aT (n/b) + f (n), assim
f (n) = 1, a = 1 e b = 3/2, logo
f (n) = 1 = (nlog3/2 1 ) = n0 = 1, utilizando o Segundo Caso do Teorema, temos
que
T (n) = (nlog3/2 1 log n) = (n0 log n)
Podemos concluir que a complexidade da funca o refazerHeap e igual a O(log n).
2.4.2. criarHeap
Cada execuca o de refazerHeap gasta O(log n), sendo executado n vezes. Assim, criarHeap possui complexidade O(n log n). Porem, analises mais precisas desse algoritmo,
as quais levam em consideraca o a altura dos nos determinada por h, chegam a conclusao
de que a complexidade do algoritmo criarHeap e igual a O(n) [Miyazawa 2007].
2.4.3. heapsort
A primeira chamada da funca o e o algoritmo criarHeap, o qual possui complexidade
O(n). Apos o primeiro elemento ser trocado pelo u ltimo, sobram apenas n 1 elementos para serem ordenados. Esses u ltimos serao ordenados por chamadas a` funca o
refazerHeap, a qual possui complexidade O(log n). Assim, a complexidade do metodo
de ordenaca o Heapsort e O(n log n).
3. Caso de Teste
Como forma de melhor exemplificar o funcionamento do metodo de ordenaca o Heapsort,
observemos o fluxo a seguir que representa os passos de ordenaca o do heap apresentado
na figura 2. As setas indicam as trocas ou mudancas que devem acontecer no processo de
ordenaca o.
Os passos mostrados nas figuras 3 e 4 sao referentes a` execuca o do algoritmo
criarHeap ja no incio da execuca o do heapsort. Neste momento, a estrutura heap esta
sendo organizada, com intuito de que o maior elemento do Heap fique na posica o 0 do
array. Ao finalizar essas etapas, o maior elemento e trocado com o u ltimo elemento do
array, como demonstra as figuras 4(b) e 5(a). Depois de realizada a troca, o algoritmo
nao altera o valor do u ltimo elemento, percorrendo os n 1 que restam ser ordenados da
mesma forma que os passos anteriores a` troca (Figura 5(b)). A continuaca o da ordenaca o
do heap pode ser visualizada no Anexo A.
4. Aplicaco es
Alem de ser usado para resolver problemas de ordenaca o, o heapsort tambem pode ser
utilizado na simulaca o de eventos e paginaca o de memoria. Outro exemplo de aplicaca o e
(a)
(b)
Figura 3. Passos 1 e 2
(a)
(b)
Figura 4. Passos 3 e 4
(a)
(b)
Figura 5. Passos 5 e 6
5. Comparaco es
Um estudo de caso foi realizado para comparar o desempenho do Heapsort com outros
quatro algoritmos de ordenaca o (InsertionSort, SelectionSort, QuickSort e MergeSort).
Implementaco es em Python dos cinco metodos foram utilizadas. Foram realizados testes com tres tipos de listas (ordenada em ordem crescente, ordenada em decrescente e
desordenada com numero aleatorios), cada tipo com dois tamanhos (500 e 4000). Os resultados obtidos, representados pelo tempo de execuca o em segundos, sao mostrados nas
tabelas 1, 2 e 3.
No decorrer da seca o, sera feita uma analise comparando cada metodo com o
algoritmo em estudo no presente artigo.
Metodo
InsertionSort
SelectionSort
QuickSort
MergeSort
HeapSort
500
0.001
0.043
0.001
0.01
0.014
4000
0.004
2.631
0.016
0.094
0.159
Metodo
InsertionSort
SelectionSort
QuickSort
MergeSort
HeapSort
500
0.089
0.039
0.002
0.01
0.013
4000
5.667
2.471
0.019
0.103
0.143
Metodo
InsertionSort
SelectionSort
QuickSort
MergeSort
HeapSort
500
0.045
0.039
0.004
0.011
0.014
4000
2.809
2.413
0.04
0.107
0.151
Aleatorios
6. Conclusao
Neste artigo, realizou-se uma explanaca o sobre o metodo de ordenaca o Heapsort, descrevendo as estruturas que o compoem e o custo computacional obtido ao utilizar o algoritmo. Por meio dos pseudo-codigo apresentados e da demonstraca o de ordenaca o de
uma lista de elementos durante um caso de teste, verificou-se que o algoritmo possui alto
nvel de usabilidade.
A partir dos resultados obtidos na comparaca o do desempenho do metodo de
ordenaca o estudado com outros quatro algoritmos e possvel avaliar melhor em quais
situaco es o Heapsort seria a melhor escolha. Importante ressaltar que o mesmo nao e
recomendado para vetores de entrada com poucos elementos devido a complexidade em
sua implementaca o.
Como trabalho futuro, um melhor estudo de caso poderia ser feito utilizando uma
quantidade maior de elementos por array e um numero maior de metodos de ordenaca o de
forma que seria possvel melhor analisar o desempenho entre eles. Outra proposta seria
estudar a implementaca o mais eficiente do algoritmo, buscando um custo computacional
relativamente menor que o esperado.
Referencias
Abdala, D. D. (2012). Fila de prioridades. Disponvel em: http://www.facom.
ufu.br/abdala/DAS5102/TEO_HeapFilaDePrioridade.pdf (acessado em 28 de Novembro de 2014).
Celes, Waldemar e Rangel, J. L. (2002). Apostila de estrutura de dados. Disponvel
em: http://www-usr.inf.ufsm.br/juvizzotto/elc1067-2013b/
estrut-dados-pucrio.pdf (acessado em 28 de Novembro de 2014).
Fuguo, D. (2011). A novel median filtering algorithm based on incomplete heapsort
algorithm. algorithms, 1:12.
Horowitz, M. L. (2001). Sort system for text retrieval. US Patent 6,278,990.
Miyazawa, F. K. (2007). Notas de aula de complexidade de algoritmos. Disponvel em: http://www.dcc.ufrj.br/francisco_vianna/livros/
Apostila.de.Algoritmos.-.UNICAMP.pdf (acessado em 01 de Dezembro
de 2014).
Nonato, Luis Gustavo e Vieira, V. H. (2003). Teorema master. Disponvel em: http://
www.lcad.icmc.usp.br/nonato/ED/Ordenacao/node51.htm (acessado em 01 de Dezembro de 2014).
Parreira Junior, W. M. (2014). Apostila de analise de algoritmos. Disponvel em:
http://www.waltenomartins.com.br/aa_aps.pdf (acessado em 28 de
Novembro de 2014).
Silva, E. d. S. d. (2010).
Estudo comparativo de algoritmos de ordenaca o.
Disponvel em: http://inajourney.files.wordpress.com/2012/11/
eliezer3.pdf (acessado em 28 de Novembro de 2014).
Zabootny, W. M. (2011). Dual port memory based heapsort implementation for fpga.
In Photonics Applications in Astronomy, Communications, Industry, and High-Energy
Physics Experiments 2011, pages 80080E80080E. International Society for Optics
and Photonics.
Ziviani, N. et al. (2004). Projeto de Algoritmos: com Implementaco es em Pascal e C,
volume 2. Thomson.
A. Figuras
(a)
(b)
Figura 6. Passos 7 e 8
(a)
(b)
Figura 7. Passos 9 e 10
(a)
(b)
Figura 8. Passos 11 e 12
(a)
(b)
Figura 9. Passos 13 e 14
(a)
(b)
Figura 10. Passos 15 e 16
(a)
(b)
Figura 11. Passos 17 e 18
(a)
(b)
Figura 12. Passos 19 e 20
(a)
(b)
Figura 13. Passos 21 e 22
(a)
(b)
Figura 14. Passos 23 e 24