Prvky majú pridelenú prioritu.
Najprv sa odstraňuje prvok s najväčšou prioritou.
Takmer úplný binárny strom ktorý je "kopovitý".
https://en.wikipedia.org/wiki/Heap_(data_structure)
(Najmenší možný kúsok dynamickej pamäte je často 1 kB a viac).
Počet uzlov s hĺbkou n
je n^2
, okrem poslednej úrovne.
https://en.wikipedia.org/wiki/Heap_(data_structure)
int parent(int i){
return (i -1) / 2;
}
int left_child(int i){
return (2*i) + 1;
}
int right_child(int i){
return (2*i) + 2;
}
(Heap property)
Každý rodič je väčší alebo rovný ako všetci jeho potomkovia.
[quote, Black Paul E. (2004). Entry for heap in Dictionary of Algorithms and Data Structures. ]
If P is a parent node of C, then the key (the value) of P is either greater than or equal to (in a max heap) or less than or equal to (in a min heap) the key of C.
Všetky prvky musia spĺňať podmienku kopovitosti.
Usporiadanie poľa tak aby bolo kopovité.
https://www.geeksforgeeks.org/heap-sort/
Predpokladáme, že ľavý a pravý podstrom prvku i
sú kopovité.
Výsledkom je, že strom s vrcholom i
je kopa.
log(n)
.void heapify(int* array,int size,int i){
int largest = i;
int l = left_child(i);
int r = right_child(i);
// Je ľavý syn väčší?
if (l < size && array[largest] < array[l]){
largest = l;
}
// Je pravý syn väčší
if (r < size && array[largest] < array[r]){
largest = r;
}
// Ak je niektorý syn väčší
if (largest != i){
// Vymeň ich a kopuj vymenený prvok.
int v = array[i];
array[i] = array[largest];
array[largest] = v;
heapify(array,size, largest);
}
}
V druhej polovici poľa uzly nemajú potomkov.
Vieme, že v druhej polovici poľa sú určite kopovité prvky.
Kopíme všetky prvky zvyšné prvky smerom od konca ku začiatku.
void heapify_array(int* array, int size){
for (int i = size / 2; i > 0; i-- ){
heapify(array,size,i);
}
}
O(log(n))
Postupne odoberáme prvky a najväčšie presúvame na koniec.
Zložitosť je n log(n)
.
void heap_sort(int* heap,int size){
for (int i = size -1; i >= 0; i -= 2){
// Vymenime prvy a posledny prvok
int v = heap[0];
heap[0] = heap[i];
heap[i] = v;
// Na konci je najväčší prvok.
heapify(heap,i,0);
}
}
Prečo je v heap sorte i = i - 2
?