Heapsortimist demonstreeriv animatsioon | |
Algoritmi liik | Sortimisalgoritm |
---|---|
Ajaline keerukus halvimal juhul | |
Ajaline keerukus keskmiselt | |
Ajaline keerukus parimal juhul | (erinevad elemendid) või (võrdsed elemendid) |
Mahuline keerukus |
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]
Heapsorti algoritmis on järgmised etapid:[1] [2]
Olgu { 6, 5, 3, 1, 8, 7, 2, 4 } massiiv, mida tahame sortida. Kõigepealt kuhjastame massiivi ja siis hakkame sortima.
Kuhi | Lisatav
element |
Vahetatavad
elemendid |
---|---|---|
null | 6 | |
6 | 5 | |
6, 5 | 3 | |
6, 5, 3 | 1 | |
6, 5, 3, 1 | 8 | |
6, 5, 3, 1, 8 | 5, 8 | |
6, 8, 3, 1, 5 | 6, 8 | |
8, 6, 3, 1, 5 | 7 | |
8, 6, 3, 1, 5, 7 | 3, 7 | |
8, 6, 7, 1, 5, 3 | 2 | |
8, 6, 7, 1, 5, 3, 2 | 4 | |
8, 6, 7, 1, 5, 3, 2, 4 | 1, 4 | |
8, 6, 7, 4, 5, 3, 2, 1 |
Kuhi | Vahetatavad
elemendid |
Eemalda
element |
Sorditud
massiiv |
Selgitus |
---|---|---|---|---|
8, 6, 7, 4, 5, 3, 2, 1 | 8, 1 | Vaheta 8 ja 1 kohad, et eemaldada kuhjast 8. | ||
1, 6, 7, 4, 5, 3, 2, 8 | 8 | Eemalda kuhjast 8 ja lisa sorditud massiivi. | ||
1, 6, 7, 4, 5, 3, 2 | 1, 7 | 8 | Vaheta 1 ja 7 kohad, sest nad on kuhjas vales järjekorras. | |
7, 6, 1, 4, 5, 3, 2 | 1, 3 | 8 | Vaheta 1 ja 3 kohad, sest nad on kuhjas vales järjekorras. | |
7, 6, 3, 4, 5, 1, 2 | 7, 2 | 8 | Vaheta 7 ja 2 kohad, et eemaldada kuhjast 7. | |
2, 6, 3, 4, 5, 1, 7 | 7 | 8 | Eemalda kuhjast 7 ja lisa sorditud massiivi. | |
2, 6, 3, 4, 5, 1 | 2, 6 | 7, 8 | Vaheta 2 ja 6 kohad, sest nad on kuhjas vales järjekorras. | |
6, 2, 3, 4, 5, 1 | 2, 5 | 7, 8 | Vaheta 2 ja 5 kohad, sest nad on kuhjas vales järjekorras. | |
6, 5, 3, 4, 2, 1 | 6, 1 | 7, 8 | Vaheta 6 ja 1 kohad, et eemaldada kuhjast 6. | |
1, 5, 3, 4, 2, 6 | 6 | 7, 8 | Eemalda kuhjast 6 ja lisa sorditud massiivi. | |
1, 5, 3, 4, 2 | 1, 5 | 6, 7, 8 | Vaheta 1 ja 5 kohad, sest nad on kuhjas vales järjekorras. | |
5, 1, 3, 4, 2 | 1, 4 | 6, 7, 8 | Vaheta 1 ja 4 kohad, sest nad on kuhjas vales järjekorras. | |
5, 4, 3, 1, 2 | 5, 2 | 6, 7, 8 | Vaheta 5 ja 2 kohad, et eemaldada kuhjast 5. | |
2, 4, 3, 1, 5 | 5 | 6, 7, 8 | Eemalda kuhjast 5 ja lisa sorditud massiivi. | |
2, 4, 3, 1 | 2, 4 | 5, 6, 7, 8 | Vaheta 2 ja 4 kohad, sest nad on kuhjas vales järjekorras. | |
4, 2, 3, 1 | 4, 1 | 5, 6, 7, 8 | Vaheta 4 ja 1 kohad, et eemaldada kuhjast 4. | |
1, 2, 3, 4 | 4 | 5, 6, 7, 8 | Eemalda kuhjast 4 ja lisa sorditud massiivi. | |
1, 2, 3 | 1, 3 | 4, 5, 6, 7, 8 | Vaheta 1 ja 3 kohad, sest nad on kuhjas vales järjekorras. | |
3, 2, 1 | 3, 1 | 4, 5, 6, 7, 8 | Vaheta 3 ja 1 kohad, et eemaldada kuhjast 3. | |
1, 2, 3 | 3 | 4, 5, 6, 7, 8 | Eemalda kuhjast 3 ja lisa sorditud massiivi. | |
1, 2 | 1, 2 | 3, 4, 5, 6, 7, 8 | Vaheta 1 ja 2 kohad, sest nad on kuhjas vales järjekorras. | |
2, 1 | 2, 1 | 3, 4, 5, 6, 7, 8 | Vaheta 2 ja 1 kohad, et eemaldada kuhjast 2. | |
1, 2 | 2 | 3, 4, 5, 6, 7, 8 | Eemalda kuhjast 2 ja lisa sorditud massiivi. | |
1 | 1 | 2, 3, 4, 5, 6, 7, 8 | Eemalda kuhjast 1 ja lisa sorditud massiivi. | |
1, 2, 3, 4, 5, 6, 7, 8 | Sorditud ja algoritm lõpetab töö. |
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]
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]
{{netiviide}}
: CS1 hooldus: mitu nime: autorite loend (link)