Vous êtes sur la page 1sur 13

11/04/12

Algoritmo Heapsort

Projeto de Algoritmos
Home | Prefcio | Livros | Stios WWW | ndice

Heapsort
Esta pgina examina um algoritmo sofisticado que rearranja um vetor dado em ordem crescente. Para que a descrio do algoritmo fique mais simples, convm que os ndices do vetor sejam 1 . e no 0 . - , como usual em C. Resumindo, nosso algoritmo .n .n1 rearranja os elementos de um vetor v 1 . ]de tal modo que ele fique em ordem crescente, [.n ou seja, de tal modo que tenhamos v 1 v 2 . . . v n . O algoritmo, conhecido como Heapsort, foi inventado por J.W.J. Williams [] [] [] ["Algorithm 232 (heapsort)", Communications of the ACM, 7, p.347-348, 1964]. Veja o verbete Heapsort na Wikipedia. Veja tambm o captulo 14 do "Programming Pearls".

Heap (rvore binria quase completa)


O segredo do funcionamento do algoritmo uma estrutura de dados conhecida como heap (= monte). Um max-heap um vetor v 1 . ] [.m tal que [estou escrevendo me no nde propsito]:
vf2 vf [/] []

para f= 2 . . . , m Aqui, como no resto desta pgina, vamos convencionar que as expresses que figuram como ndices de um vetor so , . sempre inteiras. Uma expresso da forma "f 2 significa f 2 , ou seja, o piso de f 2 isto , a parte inteira do quociente de fpor 2 /" / /, . Assim, se v 1 . 7 um max-heap ento, em particular, v 5 v 1 ]e v 5 v 1 ] [.1] [] [0 [] [1:
1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7

999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999
www.ime.usp.br/~pf/algoritmos/aulas/hpsrt.html 1/13

11/04/12

Algoritmo Heapsort

Estranha essa definio de max-heap, no? Talvez a coisa fique mais clara se encararmos a sequncia de ndices 1 . como um rvore .m binria: o ndice 1 a raiz da rvore; o pai de um ndice f f 2( claro que 1no tem pai); / o filho esquerdo de um ndice p 2 e o filho direito 2 + ( claro que o filho esquerdo s existe se 2 me o filho direito s p p1 p existe se 2 + m p1 ). A figura abaixo procura desenhar um vetor v 1 . 5 de modo que cada filho fique na "camada" imediatamente inferior do pai. O vetor [.5] definido por v i = e portanto longe est de ser um max-heap. Observe que cada "camada", exceto a ltima, tem duas vezes mais []i elementos que a "camada" anterior. Com isso, o nmero de "camadas" de v 1 . ] exatamente 1+l ( ) sendo l ( )o piso de [.m gm, gm lgm o2 .
1 4 2 5 3 6 7

8 9 1 1 1 1 1 1 0 1 2 3 4 5 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5

Uma vez entendido o conceito de pai e filho, podemos dizer que um vetor um max-heap se o valor de todo pai maior ou igual que o valor de qualquer de seus dois filhos (onde o valor de um ndice p v p ). []

Exerccios
1. Mostre que todo vetor decrescente indexado por 12 . . . um max-heap. Mostre que a recproca no verdadeira. , , 2. O vetor abaixo um max-heap?
114 11117 9 3 2 8 1 1 6 1 0 4 1 1 1 1 1 7 6

3. Escreva uma funo que decida se um vetor v 1 . ] ou no um max-heap. [.m


www.ime.usp.br/~pf/algoritmos/aulas/hpsrt.html 2/13

11/04/12

Algoritmo Heapsort

4. Mostre que v 1 . ] um max-heap se e somente se para cada ndice ptem-se [.m a. se 2 mento v p v 2 ] p [] [p; b. se 2 + mento v p v 2 + ] p1 [] [p1.
k1 5. Suponha que v 1 . ] um max-heap com m= 2 - . Mostre que mais da metade dos elementos do vetor est na ltima [.m "camada" do max-heap, ou seja, em v 2 - . 2 - ] [k 1 . k 1.

A funo peneira
O corao de qualquer algoritmo que manipule um max-heap uma funo que recebe um vetor arbitrrio v 1 . ]e um ndice p [.m e faz v p "descer" para sua posio "correta". [] Como se faz isso? A ideia bvia. Se v p v 2 ]e v p v 2 + ]ento no preciso fazer nada. Se v p < v 2 ]e v 2 ] v 2 + ] [] [p [] [p1 [] [p [p [p1 ento basta trocar v p com v 2 ]e depois fazer v 2 ]"descer" para sua posio "correta". No difcil imaginar o que se deve fazer no [] [p [p terceiro caso. Eis um exemplo com p 1 Cada linha da tabela uma "foto" do vetor no incio de uma iterao. = . 85 99 99 99 99 85 97 97 98 98 98 98 97 97 85 93 96 96 96 96 95 95 95 95 94 94 94 94 93 93 93 85 92 92 92 92 91 91 91 91 90 90 90 90 89 89 89 89 87 87 87 87 86 86 86 86

Eis uma funo iterativa que faz o servio. A varivel f sempre um filho de p no incio de cada iterao, f ajustado de modo a ser o ; filho de maior valor de p .
www.ime.usp.br/~pf/algoritmos/aulas/hpsrt.html 3/13

11/04/12

Algoritmo Heapsort

/ Rcb pe 1. erarnaovtrv1.]d md / eee m .m eraj eo [.m e oo / qeo"uvtr cj ri psj u mxha. / u sbeo" ua az ea m a-ep / Speqeo "uvtrs cjsre soflo / u u s sbeoe" ua azs ihs / d pj somxhas / e a-ep. vi pnia(n p itm itv] od eer it , n , n [) { itf=2p x n *, ; wie( < m { hl f = ) i ( <m& vf <vf1) +f f f & [] [+] +; / foflo"asvloo d p / ih mi ais" e i ([/]> vf)bek f vf2 = [] ra; x=vf2,vf2 =vf,vf =x [/] [/] [] [] ; f* 2 = ; } }

A seguinte implementao um pouco melhor, porque faz menos trocas e executa a diviso f 2uma s vez: /
vi pnia(n p itm itv] od eer it , n , n [) { itf=2p x=vp; n *, [] wie( < m { hl f = ) i ( <m& vf <vf1) +f f f & [] [+] +; i ( > vf)bek f x = [] ra; vp =vf; [] [] p=f f=2p , *; } vp =x [] ; }

A funo peneira: desempenho


A funo p n i a muito rpida. O consumo de tempo proporcional ao nmero de iteraes, e esse numero no passa de eer
lgm o2

pois o valor de fpelo menos dobra a cada iterao.


www.ime.usp.br/~pf/algoritmos/aulas/hpsrt.html 4/13

11/04/12

Algoritmo Heapsort

Exerccios
6. A seguinte alternativa para a funo p n i afunciona corretamente? eer
vi pnia(n p itm itv] { od eer it , n , n [) itx f n , ; fr( =2p f< m f* 2 { o f *; = ; = ) i ( <m& vf <vf1) +f f f & [] [+] +; p=f2 /; i ([]> vf)bek f vp = [] ra; x=vp,vp =vf,vf =x [] [] [] [] ; } }

7. Escreva uma verso recursiva da funo p n i a eer. 8. Por que a seguinte implementao de p n i ano funciona? eer
vi pnia(n p itm itv] { od eer it , n , n [) itx n ; itf=2p n *; wie( < m { hl f = ) i ([]<vf){ f vp [] x=vp,vp =vf,vf =x [] [] [] [] ; p=f ; f=2p *; } es { le i ( <m& vp <vf1){ f f & [] [+] x=vp,vp =vf1,vf1 =x [] [] [+] [+] ; p=f1 +; f=2p *; } es bek le ra; } } }

www.ime.usp.br/~pf/algoritmos/aulas/hpsrt.html

5/13

11/04/12

Algoritmo Heapsort

Por que um heap til?


Por que um max-heap uma estrutura de dados to poderosa? Suponha que v 1 . ] um max-heap; ento [.m a. a pergunta "qual o maior elemento de vetor?" pode ser respondida instantaneamente: o maior elemento do vetor v 1 ; [] b. se o valor de v 1 for alterado, o max-heap pode ser restabelecido muito rapidamente: a operao p n i a( , , )no demora [] eer 1mv mais que l ( )para fazer o servio; gm c. um vetor v 1 . ]arbitrrio pode ser transformado em um max-heap muito rapidamente: o comando [.m
fr( =m2 p> 1 -p pnia(,m v; o p /; = ; -) eer p , )

faz o servio em tempo proporcional a m ( fcil ver que o consumo de tempo limitado por ( l ( ) / , pois o tempo gasto em . m gm)2 cada uma das m 2iteraes limitado por l ( ) um pouco mais difcil verificar que o tempo , na verdade, limitado por m / gm. apenas.)

Exerccios
9. Mostre que o fragmento de programa abaixo faz no mximo mcomparaes entre elementos do vetor.
fr( =m2 p> 1 -p pnia(,m v; o p /; = ; -) eer p , )

10. O fragmento de programa abaixo transforma um vetor arbitrrio v 1 . ]em max-heap? [.m
fr( =1 p< m2 +p pnia(,m v; o p ; = /; +) eer p , )

11. Critique a seguinte ideia: para transformar um vetor arbitrrio em max-heap, basta coloc-lo em ordem decrescente. 12. Escreva uma funo f que receba um vetor ve um ndice ktais que v 1 . - ] um max-heap e transforme v 1 . ] em f [.k1 [.k max-heap. Sua funo deve fazer no mximo 2l ( )comparaes entre elementos do vetor. Agora use f para construir uma gk f funo que transforme qualquer vetor v 1 . ]em max-heap. Sua funo deve fazer no mximo 2ml ( ) comparaes entre [.m gm elementos do vetor.

www.ime.usp.br/~pf/algoritmos/aulas/hpsrt.html

6/13

11/04/12

Algoritmo Heapsort

O algoritmo heapsort
No difcil juntar tudo que dissemos acima para obter um algoritmo que coloque v 1 . ]em ordem crescente. [.n
/ Rarnao eeetsd vtrv1.] / eraj s lmno o eo [.n / d md qefqe e odmcecne / e oo u ium m re rset vi hasr (n n itv] od epot it , n [) { itp m x n , , ; fr( =n2 p> 1 -p o p /; = ; -) pnia(,n v; eer p , ) fr( =n m> 2 -m { o m ; = ; -) x=v1,v1 =vm,vm =x [] [] [] [] ; pnia(,m1 v; eer 1 -, ) } }

O comando f rtransforma o vetor em um max-heap recorrendo cerca de n 2vezes funo p n i a Feito isso, temos um processo o / eer. iterativo controlado pelo segundo f r No incio de cada iterao valem os seguinte invariantes: o. o vetor v 1 . ] uma permutao do vetor original, [.n o vetor v 1 . ] um max-heap, [.m v 1 . ] v m 1 . ]e [.m [+.n o vetor v m 1 . ]est em ordem crescente. [+.n claro que v 1 . ]estar em ordem crescente quando mfor igual a 1 [.n .
m n max-heap crescente 888 777 666 555 444 333 222 111 000 999 999 999 999 999 elementos pequenos elementos grandes 1

Heapsort: desempenho
www.ime.usp.br/~pf/algoritmos/aulas/hpsrt.html 7/13

11/04/12

Algoritmo Heapsort

Quanto tempo o h a s r leva para fazer o servio? O tempo proporcional ao nmero de comparaes entre elementos do vetor, e epot esse nmero no passa de
3nl g n, o2

mesmo no pior caso. De fato, o primeiro f rconstri o max-heap inicial e faz no mximo nl ( ) comparaes entre elementos do o gn vetor. (Uma anlise mais cuidadosa revela que o nmero de comparaes no passa de n O segundo f rexecuta cerca de nchamadas ). o de p n i ae cada uma dessas chamadas faz no mximo 2l ( ) comparaes entre elementos do vetor. eer gn

Heapsort: animaes
Veja applets de animao do algoritmo: Sorting Algorithms Animation by David R. Martin Sorting Algorithms na Universidade de British Columbia Sorting Algorithms, pgina de Pat Morin na Universidade de Carlton, Canad

Exerccios
13. Use o h a s r para ordenar o vetor epot
1 1 1 1 1 1 1 987654 6 5 4 3 2 1 0 .

14. Suponha que o vetor v 1 . ] um max-heap. O seguinte fragmento de cdigo rearranja o vetor em ordem crescente? [.n
fr( =n m> 2 -m { o m ; = ; -) itx=v1; n [] fr( =1 j<m +j vj =vj1; o j ; ; +) [] [+] vm =x [] ; }

15. Implemente um max-heap com ponteiros. Cada clula ter um v l re trs ponteiros: um aponta o pai da clula, outro aponta o ao filho direito e outro aponta o filho esquerdo. Escreva uma verso da funo p n i apara um max-heap implementado com eer ponteiros.
www.ime.usp.br/~pf/algoritmos/aulas/hpsrt.html 8/13

11/04/12

Algoritmo Heapsort

16. Suponha que v 1 . ] um max-heap. Suponha que i< je v i < v j . Se os valores de v i e v j forem trocados, v 1 . ] [.m [] [] [] [] [.m continuar sendo um max-heap? Repita o exerccio sob a hiptese v i > v j . [] [] 17. Escreva uma funo H que receba um max-heap v 1 . ]e rearranje o vetor de modo que ele fique em ordem crescente. Tire S [.n proveito de que o vetor dado no arbitrrio. SUGEST O: Digamos que um vetor v 1 . ] um quase max-heap se [.m
vf2 vf [/] []

para f= 4 . . . , m , .

Escreva uma funo Hque receba um quase max-heap v 1 . ]e transforme-o em um max-heap. (Basta fazer uma verso [.m ligeiramente especializada de p n i a Use Hpara escrever H . e e r .) S 18. Escreva uma funo que rearranje um vetor v 1 . ]de modo que ele fique em ordem decrescente. SUGEST O: Adapte a [.n definio de max-heap para o problema em questo. Reescreva a funo p n i a eer.

Uma verso mais rpida do Heapsort


A seguinte verso do Heapsort, um pouco diferente da examinada acima, conhecida com Bottom-Up-Heapsort:
/ Rarnao eeetsd vtrv1.] / eraj s lmno o eo [.n / d md qefqe e odmcecne / e oo u ium m re rset vi bto_phasr (n n itv] od otmu_epot it , n [) { itm f mx t n , , a, ; cnto_ep(,v; osriha n ) fr( =n m>1 -m { o m ; ; -) mx=v1; a [] f=2 ; wie( < m { hl f = ) i ( <m& vf <vf1)+f f f & [] [+] +; vf2 =vf; [/] [] f* 2 = ; } f=f2 /; i ( <m { f f ) t=vf,vf =vm,vm =t [] [] [] [] ;
www.ime.usp.br/~pf/algoritmos/aulas/hpsrt.html 9/13

11/04/12

Algoritmo Heapsort

wie( >1& vf2 <vf){ hl f & [/] [] t=vf,vf =vf2,vf2 =t [] [] [/] [/] ; f=f2 /; } } vm =mx [] a; } }

No comeo de cada iterao do f r o vetor v 1 . ] um heap que contm os elementos pequenos e o vetor v m 1 . ] crescente e o, [.m [+.n contm os elementos grandes.

/ Rcb u vtrv1.]etasom ovtre / eee m eo [.n rnfra eo m / u mxha / m a-ep vi cnto_ep(n n itv] od osriha it , n [) { itm f t n , , ; fr( =1 m<n +m { o m ; ; +) f=m1 +; wie( >1& vf2 <vf){ hl f & [/] [] t=vf2,vf2 =vf,vf =t [/] [/] [] [] ; f=f2 /; } } }

No incio de cada iterao do f r o vetor v 1 . ] um heap. No comeo de cada iterao do w i e todos os ndices em 1 . + o, [.m hl, .m1 satisfazem a propriedade do max-heap exceto talvez v f grande demais para v f 2 . [] [/] I. Wegener e J. Stolfi observaram que esta verso Heapsort faz, em mdia, duas vezes menos comparaes entre elementos do vetor que a verso discutida acima. (Mas isso no significa, necessariamente, que ela seja duas vezes mais rpida se levarmos em conta as outras operaes, como as trocas, por exemplo.

Exerccio
www.ime.usp.br/~pf/algoritmos/aulas/hpsrt.html 10/13

11/04/12

Algoritmo Heapsort

19. Verifique que a verso abaixo do b t o _ p h a s r equivalente discutida acima. (Ela um pouco mais rpida pois faz a otmu_epot diviso "f 2 uma s vez e reduz o nmero de trocas): /"
vi bto_phasr (n n itv] { od otmu_epot it , n [) itm p f mx t n , , , a, ; cnto_ep(,v; osriha n ) fr( =n m>1 -m { o m ; ; -) mx=v1; a [] p=1 f=2 , ; wie( < m { hl f = ) i ( <m& vf <vf1)+f f f & [] [+] +; vp =vf; [] [] p=f f=2p , *; } f=p ; i ( <m { f f ) t=vm; [] wie( >1& vpf2 <t { hl f & [=/] ) vf =vp; [] [] f=p ; } vf =t [] ; } vm =mx [] a; } } vi cnto_ep(n n itv] { od osriha it , n [) itm p f t n , , , ; fr( =1 m<n +m { o m ; ; +) f=m1 +; t=vf; [] wie( >1& vp=f2 <t { hl f & [ /] ) vf =vp; [] [] f=p ; } vf =t [] ; } }

www.ime.usp.br/~pf/algoritmos/aulas/hpsrt.html

11/13

11/04/12

Algoritmo Heapsort

Veja Heapsort no Cprogramming.com URL of this site: www.ime.usp.br/~pf/algoritmos/ 1998 | Last modified: Mon Jul 4 09:18:49 BRT 2011 Paulo Feofiloff IME-USP

www.ime.usp.br/~pf/algoritmos/aulas/hpsrt.html

12/13

11/04/12

Algoritmo Heapsort

www.ime.usp.br/~pf/algoritmos/aulas/hpsrt.html

13/13

Vous aimerez peut-être aussi