9.  Stromy

9.7  Triedenie haldou

Na záver kapitoly o stromoch si priblížime jednu z rýchlych metód vnútorného triedenia (triedenia na mieste), ktorá využíva stromovú dynamickú údajovú štruktúru nazývanú halda (hromada, heap). Ide o triedenie haldou - Heapsort.

Halda je binárny strom so špeciálnymi vlastnosťami:

  • usporiadanie - pre každý vrchol platí, že jeho hodnota je väčšia (nanajvýš rovná) ako hodnoty všetkých jeho potomkov
  • tvar - každý vrchol, ktorý nie je na predposlednej alebo poslednej úrovni má dvoch synov. Na predposlednej úrovni sú zľava najskôr vrcholy s dvoma synmi, potom vrchol majúci iba ľavého syna a nakoniec vrcholy bez synov (listy).
Triedenie prebieha v dvoch fázach:

1. fáza - vytvorenie haldy

Prvky vstupnej postupnosti, ktorú chceme triediť uložíme postupne do binárneho stromu.

vstupná postupnosť: 44, 55, 12, 42, 94, 18, 6, 67, 23

  

Haldu získame postupnou výmenou obsahov vrcholov. Vychádzame z listov a vždy keď narazíme na vrchol s menšou hodotou ako hodnota aspoň jedného jeho syna, výmenou hodnôt ho necháme klesnúť.

OBRÁZOK


Na obrázku je znázornená výsledná halda:


2. fáza - výpis prvkov haldy

V koreni sa nachádza najväčší prvok postupnosti. Vypíšeme ho a potom ho odstránime - na jeho miesto uložíme najvzdialenejší prvok stojaci vpravo dolu. Obnovíme haldu - koreňový prvok "spustíme" na správne miesto. Opakujeme, kým sa halda nevyprázdni. Prvky odstránené v tomto poradí tvoria utriedenú postupnosť.

Odstránime 94
Na jeho miesto uložíme 23

Číslo 23 necháme klesnúť.





Odstránime 67.
Na jeho miesto uložíme 42.

Číslo 42 necháme klesnúť atď.



Implementácia haldy pomocou poľa

Halda sa dá jednoducho implementovať pomocou poľa. Prvky haldy sa do poľa uložia po riadkoch - úrovniach stromu.


Prvok A[i] má synov A[2i] a A[2i+1], prvok A[i/2] je otcom A[i]
Pre každé i = 2,...,n  platí:  A[i/2] >= A[i]

Namiesto toho, aby sme odstránili koreň A[1], vymeníme ho s A[n]. Zmenšíme n o jedna a nový prvok A[1] necháme klesnúť v poli A[1], ..., A[n-1] na správne miesto.

Na konci poľa sa vytvára z najväčších prvkov usporiadaná postupnosť !

[Program]

  Triedenie haldou je vylepšením triedenia priamym výberom. Výhodou je to, že v koreni haldy je vždy maximálny prvok, nemusíme ho hľadať a preto je algoritmus rýchlejší.

Dá sa dokázať, že haldu možno vytvoriť v O(n·log2n) krokoch a pokles prvku z koreňa vyžaduje najviac O(log2n) krokov. Heapsort je teda triediacim algoritmom s časovou výpočtovou zložitosťou O(n·log2n) .