Heapsort

Heapsort on sortimisalgoritm, mis sarnaneb valiksortimise algoritmiga. Sarnaselt valiksortimisega jagatakse Heapsortis massiiv sorteerimata ja sorditud osaks. Sorteerimata massiivi osast luuakse täiuslik kahendkuhi, millelt eemaldatakse suurim liige. Eemaldatud liikmest saab sorditud massiivi osa esimene element. Eemaldamist jätkatakse, kuni massiiv saab sorditud.[1]

Heapsort
Heapsortimist demonstreeriv animatsioon
Algoritmi liikSortimisalgoritm
Ajaline keerukus halvimal juhul
Ajaline keerukus keskmiselt
Ajaline keerukus parimal juhul (erinevad elemendid) või (võrdsed elemendid)
Mahuline keerukus

Algoritm

Heapsorti algoritmis on järgmised etapid:[1] [2]

  1. Sisendandmetest tuleb luua täiuslik kahendkuhi.
  2. Nüüd on suurim liige kuhja juurelement (massiivi esimene element). Eemalda suurim liige, asendades see kuhja viimase liikmega (kuhja viimane liige on massiivi sorteerimata osa viimane element). Kuhja suurus vähenes ühe võrra (eemaldatud kuhja suurimast liikmest sai sorditud massiivi osa esimene element).
  3. Vaheta juurelement oma suurima väärtusega alamtipuga, kuni kuhi vastab kuhja tingimusele (iga tipu väärtus on alamtippude omast suurem või sellega võrdne).
  4. Jätka 2. etapist algavaid tegevusi, kuni kuhjas on üks liige.

Näide

Olgu { 6, 5, 3, 1, 8, 7, 2, 4 } massiiv, mida tahame sortida. Kõigepealt kuhjastame massiivi ja siis hakkame sortima.

Heapsorti näide
1. Kuhjastamine
KuhiLisatav

element

Vahetatavad

elemendid

null6
65
6, 53
6, 5, 31
6, 5, 3, 18
6, 5, 3, 1, 8 5, 8
6, 8, 3, 1, 56, 8
8, 6, 3, 1, 57
8, 6, 3, 1, 5, 73, 7
8, 6, 7, 1, 5, 32
8, 6, 7, 1, 5, 3, 24
8, 6, 7, 1, 5, 3, 2, 41, 4
8, 6, 7, 4, 5, 3, 2, 1
2. Sortimine
KuhiVahetatavad

elemendid

Eemalda

element

Sorditud

massiiv

Selgitus
8, 6, 7, 4, 5, 3, 2, 18, 1Vaheta 8 ja 1 kohad, et eemaldada kuhjast 8.
1, 6, 7, 4, 5, 3, 2, 88Eemalda kuhjast 8 ja lisa sorditud massiivi.
1, 6, 7, 4, 5, 3, 21, 78Vaheta 1 ja 7 kohad, sest nad on kuhjas vales järjekorras.
7, 6, 1, 4, 5, 3, 21, 38Vaheta 1 ja 3 kohad, sest nad on kuhjas vales järjekorras.
7, 6, 3, 4, 5, 1, 27, 28Vaheta 7 ja 2 kohad, et eemaldada kuhjast 7.
2, 6, 3, 4, 5, 1, 778Eemalda kuhjast 7 ja lisa sorditud massiivi.
2, 6, 3, 4, 5, 12, 67, 8Vaheta 2 ja 6 kohad, sest nad on kuhjas vales järjekorras.
6, 2, 3, 4, 5, 12, 57, 8Vaheta 2 ja 5 kohad, sest nad on kuhjas vales järjekorras.
6, 5, 3, 4, 2, 16, 17, 8Vaheta 6 ja 1 kohad, et eemaldada kuhjast 6.
1, 5, 3, 4, 2, 667, 8Eemalda kuhjast 6 ja lisa sorditud massiivi.
1, 5, 3, 4, 21, 56, 7, 8Vaheta 1 ja 5 kohad, sest nad on kuhjas vales järjekorras.
5, 1, 3, 4, 21, 46, 7, 8Vaheta 1 ja 4 kohad, sest nad on kuhjas vales järjekorras.
5, 4, 3, 1, 25, 26, 7, 8Vaheta 5 ja 2 kohad, et eemaldada kuhjast 5.
2, 4, 3, 1, 556, 7, 8Eemalda kuhjast 5 ja lisa sorditud massiivi.
2, 4, 3, 12, 45, 6, 7, 8Vaheta 2 ja 4 kohad, sest nad on kuhjas vales järjekorras.
4, 2, 3, 14, 15, 6, 7, 8Vaheta 4 ja 1 kohad, et eemaldada kuhjast 4.
1, 2, 3, 445, 6, 7, 8Eemalda kuhjast 4 ja lisa sorditud massiivi.
1, 2, 31, 34, 5, 6, 7, 8Vaheta 1 ja 3 kohad, sest nad on kuhjas vales järjekorras.
3, 2, 13, 14, 5, 6, 7, 8Vaheta 3 ja 1 kohad, et eemaldada kuhjast 3.
1, 2, 334, 5, 6, 7, 8Eemalda kuhjast 3 ja lisa sorditud massiivi.
1, 21, 23, 4, 5, 6, 7, 8Vaheta 1 ja 2 kohad, sest nad on kuhjas vales järjekorras.
2, 12, 13, 4, 5, 6, 7, 8Vaheta 2 ja 1 kohad, et eemaldada kuhjast 2.
1, 223, 4, 5, 6, 7, 8Eemalda kuhjast 2 ja lisa sorditud massiivi.
112, 3, 4, 5, 6, 7, 8Eemalda kuhjast 1 ja lisa sorditud massiivi.
1, 2, 3, 4, 5, 6, 7, 8Sorditud ja algoritm lõpetab töö.

Jõudlus

Kahendkuhja loomise ajaline keerukus on . Juurelemendi oma suurima väärtusega alamtipuga vahetamine, kuni kuhi vastab kuhja tingimusele, on ajalise keerukusega . Kokku tuleb Heapsorti ajaliseks keerukuseks . See ajaline keerukus on nii keskmisel kui ka halvimal juhul.[3]

Heapsorti mahuline keerukus on .[4]

Võrdlus teiste sortimisalgoritmidega

Mestimissortimisel ajaline keerukus nii keskmisel kui ka halvimal juhul on , mahuline keerukus on aga . Seetõttu eelistatakse Heapsorti mestimissortimisele siis, kui sortimiseks kuluv mälumaht on oluline.[3]

Kiirsortimise keskmiseks ajaliseks keerukuseks on , aga üldiselt on see ikkagi kiirem kui Heapsort oma väiksema konstantse teguri tõttu. Kiirsortimise halvimaks ajaliseks keerukuseks on aga ja halvimaks mahuliseks keerukuseks . Seetõttu on Heapsort parem sortimisalgoritm siis, kui halvim ajaline ja mahuline keerukus on olulised.[3]

Viited