Algoritmul HeapSort

22
Calin Jebelean Algoritmul HeapSort 1 Algoritmul HeapSort HeapSort este unul din algoritmii de sortare foarte performanti, fiind de clasa O(N·log 2 N) Mai este cunoscut sub denumirea de “sortare prin metoda ansamblelor” Desi nerecursiv, este aproape la fel de performant ca si algoritmii de sortare recursivi (QuickSort fiind cel mai cunoscut) HeapSort este un algoritm de sortare “in situ”, adica nu necesita structuri de date suplimentare, ci sortarea se face folosind numai spatiul de memorie al tabloului ce trebuie sortat Exista si implementari HeapSort care nu sunt “in situ”

description

Algoritmul HeapSort. HeapSort este unul din algoritmii de sortare foarte performanti, fiind de clasa O(N · log 2 N) Mai este cunoscut sub denumirea de “sortare prin metoda ansamblelor” - PowerPoint PPT Presentation

Transcript of Algoritmul HeapSort

Page 1: Algoritmul HeapSort

Calin Jebelean Algoritmul HeapSort 1

Algoritmul HeapSortHeapSort este unul din algoritmii de sortare foarte performanti, fiind de clasa O(N·log2N)Mai este cunoscut sub denumirea de “sortare prin metoda ansamblelor”Desi nerecursiv, este aproape la fel de performant ca si algoritmii de sortare recursivi (QuickSort fiind cel mai cunoscut)HeapSort este un algoritm de sortare “in situ”, adica nu necesita structuri de date suplimentare, ci sortarea se face folosind numai spatiul de memorie al tabloului ce trebuie sortatExista si implementari HeapSort care nu sunt “in situ”

Page 2: Algoritmul HeapSort

Calin Jebelean Algoritmul HeapSort 2

Algoritmul HeapSort

Algoritmul se aseamana, in unele privinte, cu sortarea prin selectie (SelSort)La fiecare pas, cel mai mic element din tablou este gasit si mutat in spatele tabloului, fiind ignorat de pasii urmatori, care vor continua pe restul tablouluiDiferenta fata de SelSort este ca pasii urmatori ai algoritmului vor depune un efort mai mic (chiar mult mai mic) pentru a depista minimul din tabloul ramasFiecare pas al algoritmului are darul de a usura sarcina pasilor ce urmeaza, ceea ce duce la performanta foarte buna a algoritmului

Page 3: Algoritmul HeapSort

Calin Jebelean Algoritmul HeapSort 3

Algoritmul HeapSort

Gasirea minimului din tablou, operatie ce are loc la fiecare pas, se bazeaza pe aducerea tabloului la forma de ansambluUn ansamblu este un sir Ai (i = 1 … N) care indeplineste urmatoarele conditii pentru fiecare i:

Ai ≤ A2·i

Ai ≤ A2·i+1

Evident, pentru valori ale lui i mai mari decat N/2 nu se pune problema indeplinirii conditiilor de mai sus

Page 4: Algoritmul HeapSort

Calin Jebelean Algoritmul HeapSort 4

Algoritmul HeapSort

Orice tablou poate fi transformat usor intr-un arbore binar

1 2 3 4 5 6 7 8Index: A1 A2 A3 A4 A5 A6 A7 A8A:

A1

A2 A3

A4 A5 A6 A7

A8

9

A9

A9

Page 5: Algoritmul HeapSort

Calin Jebelean Algoritmul HeapSort 5

Algoritmul HeapSort

Daca tabloul era ansamblu, se observa ca arborele binar obtinut indeplineste urmatoarea conditie: “fiecare nod are cheia mai mare sau egala cu a tatalui sau”.Astfel, A2 si A3 sunt mai mari sau egale cu A1, A4 si A5 sunt mai mari sau egale cu A2, s. a. m. d.

Dar A1 este radacina arborelui binar, ceea ce inseamna ca A1 trebuie sa fie elementul minim al tabloului

Deci intr-un ansamblu, elementul minim se afla intotdeauna pe prima pozitieIn cadrul algoritmului HeapSort, daca la fiecare pas aducem tabloul pe care lucram la forma unui ansamblu inseamna ca am localizat in acelasi timp si minimul din tablou

Page 6: Algoritmul HeapSort

Calin Jebelean Algoritmul HeapSort 6

Algoritmul HeapSort

Aducerea unui tablou la forma de ansamblu se face urmarind situatii cum este cea descrisa mai jos:

Daca nu este indeplinita una din conditiile Ai ≤ A2·i si Ai ≤ A2·i+1

atunci se va interschimba Ai cu minimul dintre A2·i si A2·i+1

Elementele astfel interschimbate vor indeplini conditia de ansambluPentru o eficienta cat mai mare, urmarirea acestui gen de situatii trebuie facuta de la dreapta la stanga, in caz contrar fiind nevoie de reveniri repetate chiar si dupa ce o situatie de neconcordanta a fost rezolvata

1Index:

A1A:

i

Ai

2·i+1A2·i+1

2·i

A2·i

N

AN

Page 7: Algoritmul HeapSort

Calin Jebelean Algoritmul HeapSort 7

Algoritmul HeapSort

Vom studia, pas cu pas, modul in care un tablou oarecare poate fi transformat in ansambluAceasta transformare se va aplica la fiecare pas in cadrul algoritmului HeapSort, pe un tablou din ce in ce mai mic (deoarece dupa fiecare pas, primul element al tabloului, care este elementul minim, va fi eliminat si “pus la pastrare”, algoritmul continuand pe restul tabloului)Pentru simplitate, vom lucra pe reprezentarea sub forma de arbore a tabloului:

1 2 3 4 5 6 7 8Index: 9 5 1 8 6 4 3 7A:

9

2

Page 8: Algoritmul HeapSort

Calin Jebelean Algoritmul HeapSort 8

Algoritmul HeapSort

Problema se pune numai pentru noduri neterminaleLocalizam cel mai de jos nod neterminal, si in caz ca sunt mai multe astfel de noduri, il consideram pe cel mai din dreapta – acesta este 8Cum 8 are fiii 7 si 2 si este mai mare decat ambii, se va interschimba cu cel mai mic dintre ei, adica cu 2

9

5 1

8 6 4 3

7 2

Page 9: Algoritmul HeapSort

Calin Jebelean Algoritmul HeapSort 9

Algoritmul HeapSort

Urmatorul nod neterminal este 1 (nodul 5 este pe acelasi nivel, dar il alegem intotdeauna pe cel mai din dreapta in astfel de cazuri)Nodul 1 este mai mic decat fiii sai, deci nu va face obiectul vreunei interschimbariTrecand la nodul 5, acesta nu indeplineste conditiile, ca atare va fi interschimbat cu cel mai mic fiu al sau, anume 2

9

5 1

2 6 4 3

7 8

Page 10: Algoritmul HeapSort

Calin Jebelean Algoritmul HeapSort 10

Algoritmul HeapSort

Inainte de a trece la noul nod neterminal, verificam ca ultimul nod interschimbat (5) sa indeplineasca conditia referitoare la fiii sai (7 si 8) – se observa ca o indeplinesteNoul nod neterminal este 9Acesta nu indeplineste conditiile, fiind mai mare si decat 2 si decat 1, ca atare, 9 va fi interschimbat cu cel mai mic, deci cu 1

9

2 1

5 6 4 3

7 8

Page 11: Algoritmul HeapSort

Calin Jebelean Algoritmul HeapSort 11

Algoritmul HeapSort

S-ar putea ca ultimul nod interschimbat (9) inca sa nu indeplineasca conditiile referitoare la fiii sai, in noua sa locatie9 fiind mai mare si decat 4 si decat 3, se va interschimba cu 3 (cel mai mic)Astfel de interschimbari repetate vor avea loc pana cand 9 ajunge pe un nivel pe care fiii sai sunt mai mari sau egali cu el (sau pe un nivel unde nu mai are fii)

1

2 9

5 6 4 3

7 8

Page 12: Algoritmul HeapSort

Calin Jebelean Algoritmul HeapSort 12

Algoritmul HeapSort

9 a ajuns pe un nivel terminal (nu mai are fii) deci nu mai continuam in josIn acest moment, tabloul a ajuns la forma de ansamblu, fiecare nod avand cheia mai mica sau egala decat cheile fiilor saiCel mai mic element al tabloului a ajuns pe post de radacinaInterschimbam radacina cu ultimul element al tabloului, adica 1 cu 8

1

2 3

5 6 4 9

7 8

Page 13: Algoritmul HeapSort

Calin Jebelean Algoritmul HeapSort 13

Algoritmul HeapSort

Elementul minim (1) se elimina si se adauga la un tablou auxiliar, initial vid, care va contine la final elementele sortateAcesta a fost primul pas al algoritmului de sortare HeapSortVom studia inca un pas al algoritmului

8

2 3

5 6 4 9

7 1

Page 14: Algoritmul HeapSort

Calin Jebelean Algoritmul HeapSort 14

Algoritmul HeapSort

Situatia actuala este prezentata mai jos:

8

2 3

5 6 4 9

7

1 2 3 4 5 6 7 8Index: 1 - - - - - - -Tablou

auxiliar:

9

-

1

Page 15: Algoritmul HeapSort

Calin Jebelean Algoritmul HeapSort 15

Algoritmul HeapSort

Nodurile neterminale considerate sunt, in ordine: 5, 3, 2 si 8Datorita pasului anterior, nodurile 5, 3 si 2 indeplinesc conditiile referitoare la fiii lor (pasii anteriori au usurat sarcina pasului curent)Nodul 8 nu indeplineste conditiile, deci va fi interschimbat cu 2

8

2 3

5 6 4 9

7

Page 16: Algoritmul HeapSort

Calin Jebelean Algoritmul HeapSort 16

Algoritmul HeapSort

Nici in noua locatie, 8 nu indeplineste conditiile, ca urmare va fi interschimbat cu 5

2

8 3

5 6 4 9

7

Page 17: Algoritmul HeapSort

Calin Jebelean Algoritmul HeapSort 17

Algoritmul HeapSort

Nici in noua locatie, 8 nu indeplineste conditiile, ca urmare va fi interschimbat cu 7

2

5 3

8 6 4 9

7

Page 18: Algoritmul HeapSort

Calin Jebelean Algoritmul HeapSort 18

Algoritmul HeapSort

8 nu mai are fii, deci ne oprim aiciTabloul a devenit ansamblu, cel mai mic element din tablou ajungand pe post de radacinaInterschimbam radacina cu ultimul element al tabloului, adica 2 cu 8

2

5 3

7 6 4 9

8

Page 19: Algoritmul HeapSort

Calin Jebelean Algoritmul HeapSort 19

Algoritmul HeapSort

Elementul minim (2) se elimina si se adauga la tabloul auxiliarAcesta a fost al doilea pas al algoritmului de sortare HeapSort

8

5 3

7 6 4 9

2

Page 20: Algoritmul HeapSort

Calin Jebelean Algoritmul HeapSort 20

Algoritmul HeapSort

Situatia actuala este prezentata mai jos:

8

5 3

7 6 4 9

2

1 2 3 4 5 6 7 8Index: 1 2 - - - - - -Tablou

auxiliar:

9

-

Page 21: Algoritmul HeapSort

Calin Jebelean Algoritmul HeapSort 21

Algoritmul HeapSort

Repetand algoritmul de transformare a tabloului in ansamblu si eliminand dupa fiecare pas elementul minim obtinut (radacina arborelui), vom obtine in tabloul auxiliar elementele ordonateLa fiecare pas, tabloul scade cu un elementDe asemenea, se poate observa ca la fiecare pas, in afara de radacina arborelui, toate celelalte elemente indeplinesc deja conditia de ansamblu datorita pasului anteriorRezulta ca sarcina fiecarui pas nou este mult usurata de activitatea pasului/pasilor precedenti, ceea ce face ca algoritmul HeapSort sa fie foarte performant

Page 22: Algoritmul HeapSort

Calin Jebelean Algoritmul HeapSort 22

Algoritmul HeapSort

Algoritmul HeapSort este cel mai slab algoritm de clasa O(N·log2N)

Este mai slab (dar nu cu mult) decat algoritmii din familia QuickSort, dar are marele avantaj fata de acestia ca nu este recursivAlgoritmii recursivi ruleaza rapid, dar consuma o mare cantitate de memorie, ceea ce nu le permite sa sorteze tablouri de dimensiuni oricat de mariHeapSort este un algoritm care “impaca” viteza cu consumul relativ mic de memorie