Documente Academic
Documente Profesional
Documente Cultură
Calin Jebelea
Algoritmul HeapSort
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 tabloului
Diferenta 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
ramas
Fiecare pas al algoritmului are darul de a usura
sarcina pasilor ce urmeaza, ceea ce duce la
performanta foarte buna a algoritmului
Calin Jebelea
Algoritmul HeapSort
Algoritmul HeapSort
Gasirea minimului din tablou, operatie ce are loc
la fiecare pas, se bazeaza pe aducerea tabloului
la forma de ansamblu
Un ansamblu este un sir A i (i = 1 N) care
indeplineste urmatoarele conditii pentru fiecare i:
Ai A2i
Ai A2i+1
Calin Jebelea
Algoritmul HeapSort
Algoritmul HeapSort
Orice tablou poate fi transformat usor intr-un arbore
binar
Index 1 2 3 4 5 6 7 8 9
A:: A1 A2 A3 A4 A5 A6 A7 A8 A9
A1
A2
A4
A8
Calin Jebelea
A3
A5
A6
A9
Algoritmul HeapSort
A7
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 A 1, 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 pozitie
In 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
Calin Jebelea
Algoritmul HeapSort
Algoritmul HeapSort
Aducerea unui tablou la forma de ansamblu se face urmarind
situatii cum este cea descrisa mai jos:
Index:
2i
A:
A1
Ai
A2i
2i+
A1
2i+1
AN
Calin Jebelea
Algoritmul HeapSort
Algoritmul HeapSort
Vom studia, pas cu pas, modul in care un tablou
oarecare poate fi transformat in ansamblu
Aceasta 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:
Index 1
A:: 9
Calin Jebelea
Algoritmul HeapSort
Algoritmul HeapSort
9
5
8
7
1
6
Calin Jebelea
Algoritmul HeapSort
Algoritmul HeapSort
9
5
2
7
1
6
Calin Jebelea
Algoritmul HeapSort
Algoritmul HeapSort
9
2
5
7
1
6
Calin Jebelea
Algoritmul HeapSort
10
Algoritmul HeapSort
1
2
5
7
9
6
Calin Jebelea
Algoritmul HeapSort
11
Algoritmul HeapSort
1
2
5
7
3
6
9 a ajuns pe un nivel terminal (nu mai are fii) deci nu mai continuam in
jos
In acest moment, tabloul a ajuns la forma de ansamblu, fiecare nod
avand cheia mai mica sau egala decat cheile fiilor sai
Cel mai mic element al tabloului a ajuns pe post de radacina
Interschimbam radacina cu ultimul element al tabloului, adica 1 cu 8
Calin Jebelea
Algoritmul HeapSort
12
Algoritmul HeapSort
8
2
5
7
3
6
Calin Jebelea
Algoritmul HeapSort
13
Algoritmul HeapSort
Situatia actuala este prezentata mai jos:
8
2
5
7
3
6
Index 1 2 3 4 5
Tablou: 1 auxiliar:
Calin Jebelea
Algoritmul HeapSort
14
Algoritmul HeapSort
8
2
5
3
6
7
Nodurile neterminale considerate sunt, in ordine: 5, 3, 2 si 8
Datorita 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
Calin Jebelea
Algoritmul HeapSort
15
Algoritmul HeapSort
2
8
5
3
6
7
Nici in noua locatie, 8 nu indeplineste conditiile, ca
urmare va fi interschimbat cu 5
Calin Jebelea
Algoritmul HeapSort
16
Algoritmul HeapSort
2
5
8
3
6
7
Nici in noua locatie, 8 nu indeplineste conditiile, ca
urmare va fi interschimbat cu 7
Calin Jebelea
Algoritmul HeapSort
17
Algoritmul HeapSort
2
5
7
3
6
8
8 nu mai are fii, deci ne oprim aici
Tabloul a devenit ansamblu, cel mai mic element din tablou
ajungand pe post de radacina
Interschimbam radacina cu ultimul element al tabloului, adica
2 cu 8
Calin Jebelea
Algoritmul HeapSort
18
Algoritmul HeapSort
8
5
7
3
6
2
Elementul minim (2) se elimina si se adauga la tabloul
auxiliar
Acesta a fost al doilea pas al algoritmului de sortare
HeapSort
Calin Jebelea
Algoritmul HeapSort
19
Algoritmul HeapSort
Situatia actuala este prezentata mai jos:
8
5
7
3
6
2
Index 1 2 3 4 5
Tablou: 1 2
auxiliar:
Calin Jebelea
Algoritmul HeapSort
20
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 ordonate
La fiecare pas, tabloul scade cu un element
De asemenea, se poate observa ca la fiecare pas, in
afara de radacina arborelui, toate celelalte elemente
indeplinesc deja conditia de ansamblu datorita
pasului anterior
Rezulta ca sarcina fiecarui pas nou este mult usurata
de activitatea pasului/pasilor precedenti, ceea ce
face ca algoritmul HeapSort sa fie foarte performant
Calin Jebelea
Algoritmul HeapSort
21
Algoritmul HeapSort
Algoritmul HeapSort este cel mai slab algoritm de
clasa O(Nlog2N)
Este mai slab (dar nu cu mult) decat algoritmii din
familia QuickSort, dar are marele avantaj fata de
acestia ca nu este recursiv
Algoritmii recursivi ruleaza rapid, dar consuma o
mare cantitate de memorie, ceea ce nu le permite
sa sorteze tablouri de dimensiuni oricat de mari
HeapSort este un algoritm care impaca viteza
cu consumul relativ mic de memorie
Calin Jebelea
Algoritmul HeapSort
22