Você está na página 1de 12

Heapnalysis: Um Estudo sobre o Metodo de Ordenaca o

Heapsort
Ivens Cabral1 , Izabete Lima1 , Ldice Angelina1 , Luiz Pereira1 , Walysson Barbosa1
1

Universidade Federal de Alagoas (UFAL)


Campus Arapiraca

{brunoiivens,izabetelima,lidiceangelina,luizp418,walysson.vital}@gmail.com

Abstract. Sorting methods are structures of great importance for Information


Technology. As many such algorithms exist, it is clear the need of a study about
them in order to let developers better choose the sorting method that will satisfy
the requirements of a project that will make use of the method. This paper aims
to explain one of these methods, the Heapsort. It describes the algorithm structure, characteristics and some applications. Additionally, it makes a comparison with four other sorting methods, showing the advantages and disadvantages
between them.
Resumo. Metodos de ordenaca o sao estruturas de grande importancia para o
setor de Tecnologia da Informaca o. Devido a` existencia de muitos de tais algoritmos, necessita-se de um estudo sobre os mesmo para que possa ser possvel a
escolha do melhor metodo de acordo com o ambiente no qual o mesmo sera
aplicado. Esse artigo tem como objetivo realizar uma explanaca o sobre o
metodo de ordenaca o Heapsort, descrevendo sua estrutura, caractersticas e
algumas aplicaco es. Assim como ressaltando suas vantagens e desvantagens
em comparaca o com outros quatro metodos.

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].

2.1. Fila de Prioridades


Essa estrutura de dados mantem um conjunto de elementos, onde cada elemento possui
um valor [Abdala 2012]. Esse valor determina a prioridade do mesmo em relaca o aos
demais, como pode-se observar na figura 1.

Figura 1. Elemento de Lista Duplamente Encadeada

A figura mostra como e composto um elemento de uma fila de prioridades, a qual


seria implementada com uma lista duplamente encadeada, contendo, alem dos ponteiros
para os elementos anterior e proximo, um valor e uma prioridade referente ao elemento.
No entando, um array poderia ser utilizado para implementar a fila, sendo que as prioridades seriam armazenadas em cada posica o do array.
Elas possuem duas operaco es basicas: inserir elemento ou remover elemento com
maior prioridade. Tratando-se do uso de uma fila de prioridades na implementaca o do
metodo heapsort, precisa-se expandir essas operaco es de modo que a estrutura suporte
duas novas funcionalidades: criar e refazer. Para isso, utiliza-se a estrutura de dados Heap,
a qual pode ser utilizada para implementar uma fila de prioridades [Parreira Junior 2014].
2.2. Heap
Heap e estrutura de dados do tipo a rvore binaria, a qual pode ser armazenado de forma
eficiente em um array [Silva 2010]. Os itens do array sao definidos de forma que seja
a[i] um no pai, o filho a` esquerda sera representado pelo elemento a[2i] e o filho a` direita
pelo elemento a[2i + 1], como mostra a figura 2. Se tomarmos como exemplo o no
de i = 2, seus filhos serao os nos 4 (2 i = 4) e 5 (2 i + 1 = 5). Observando a
figura 2(b), os nos nao estao posicionados corretamente, pois os elementos do array nao
estao ordenados. Para resolver esse problema utilizaremos os algoritmos apresentados
posteriormente nesse artigo.
Existem dois tipos de heap: heap mnimo e heap maximo. Neste trabalho, utilizaremos o heap maximo, o qual se preocupa em retornar o valor maximo presente no array.
Nos algoritmos 1 e 2 apresentamos o pseudo-codigo das duas funco es necessarias para
implementaca o do metodo heapsort.
Explicaca o do algoritmo 1:
1. A funca o refazerHeap recebe como parametros uma estrutura heap (em nosso caso
representada por um array), o ndice de um no pai e a quantidade de elementos do
heap.
2. Para cada elemento, o algoritmo ira verificar se seus filhos possuem valor maior
que eles.


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

3. Se sim, uma troca entre eles e feita, mudando-os de posica o.


4. Caso contrario, continuar com o proximo elemento.
5. O algoritmo para quando um no folha e atingido.
Explicaca o do algoritmo 2:
1. A funca o criarHeap recebe como parametros a mesma estrutura heap citada anteriormente e a quantidade de elementos existentes nesse heap.
2. Para cada no que possui pelo menos um no filho (n elementos/2), o algoritmo
chamara a funca o refazerHeap, que recebera o ndice de um no pai a cada chamada.
3. Ao final da execuca o, o heap esta organizado.

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

a utilizaca o do algoritmo na classificaca o de dados em armazenamentos secundarios, onde


os registros sao ordenados a medida que os blocos vao sendo lidos a apartri do disco.
Algumas publicaco es que fizeram uso do algoritmo estudado nesse artigo sao descritas a seguir.
4.1. Sort System for Text Retrieval [Horowitz 2001]
Um metodo de recuperaca o de informaco es de um banco de dados e apresentado. O
metodo decompoe os documentos do banco em sub documentos, invertendo a ordenaca o

do banco de dados, decompondo tambem uma consulta de documentos em seus termos.


Apos essa decomposica o, sao atribudos valores ao relacionamento existente entre os sub
documentos e os termos. Assim, uma estrutura heap maxima e criada, sendo ordenada
pelo metodo heapsort levando em consideraca o os valores calculados anteriormente. Ao
ordenar a heap, o texto do sub documento que possuir o maior valor e exibido. Por fim, a
estrutura e reordenada, para ser exibido o texto do proximo sub documento.
4.2. A Novel Median Filtering Algorithm Based on Incomplete Heapsort Algorithm
[Fuguo 2011]
Neste trabalho, os autores implementam uma variaca o incompleta do algoritmo heapsort,
utilizando a mesma para solucionar o problema de filtraca o mediana de rudos em imagens, com o objetivo de aumentar a velocidade de filtraca o. Caractersticas da filtraca o sao
utilizadas ao executar o algoritmo, nao sendo necessaria a ordenaca o de todos os pixels
da imagem. Ao aplicar o algoritmo, com o uso de apenas alguns pixels em determinada
regiao da imagem, o valor mediano e obtido. Como o proposito do algoritmo de filtraca o
e obter esse valor, a aplicaca o do heapsort modificado e de grande ajuda pois reduz a
quantidade de operaco es que seriam necessarias para obte-lo, melhorando a eficiencia da
filtragem mediana de imagens.
4.3. Dual Port Memory Based Heapsort Implementation of FPGA [Zabootny 2011]
Uma outra implementaca o do heapsort e descrita, utilizando recursos de um FPGA, neste
caso memorias de acesso randomico dual port, com o objetivo de ordenar de forma eficiente grandes fluxos de dados. O algoritmo consegue ordenar cada registro de dados num
perodo de 2 ciclos, alcancando um rendimento alto e mnima latencia media possvel.

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

Tabela 1. Listas Ordenadas em Ordem Crescente

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

Tabela 2. Listas Ordenadas em Ordem Decrescente

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

Tabela 3. Listas Desordenadas com Numeros

Aleatorios

5.1. Insertion Sort


Os dados indicam que o metodo de ordenaca o por inserca o ganha no desempenho do
metodo heapsort apenas quando listas ordenadas em ordem crescente sao utilizadas. Assim, para listas com grandes quantidades de dados e nao ordenadas o Heapsort seria a
melhor escolha a se fazer.
5.2. Selection Sort
O metodo de ordenaca o por seleca o, o qual e a base do metodo Heapsort, perde em
desempenho em todos os tipos de lista utilizados. Como foi discutido no incio do artigo,
o Heapsort e uma versao melhorada do Selection Sort.
5.3. QuickSort e MergeSort
Ambos os metodos QuickSort e MergeSort ganham em desempenho do metodo Heapsort.
Porem, importante frisar que os tres u ltimos metodos possuem complexidade O(nlogn),
por esse motivo os tempos obtidos sao equivalentes. Conclui-se que os mesmos possuem
desempenho bem elevado em relaca o aos dois primeiros. Porem, por nao precisar de um
array auxiliar, o Heapsort tem vantagem sobre o MergeSort.

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