Proprietà del max-heap
Ogni nodo è maggiore o uguale ai propri figli. Di conseguenza il massimo dell’intero heap si trova sempre nella radice A[0]. Non è necessario che fratelli o sottoalberi diversi siano ordinati tra loro.
Algoritmi di ordinamento · 4/7
Trasforma l’array in un max-heap e porta i massimi in fondo.
Nel max-heap ogni genitore è almeno grande quanto i figli. La radice contiene il massimo: viene scambiata con la fine della parte attiva, poi si ripristina il heap.
Un heap binario è un albero binario completo che rispetta una relazione d’ordine locale. “Completo” significa che tutti i livelli sono pieni, tranne eventualmente l’ultimo, che viene riempito da sinistra verso destra. Questa forma garantisce altezza Θ(log n).
Ogni nodo è maggiore o uguale ai propri figli. Di conseguenza il massimo dell’intero heap si trova sempre nella radice A[0]. Non è necessario che fratelli o sottoalberi diversi siano ordinati tra loro.
Non servono puntatori: con indici da zero, i figli di A[i] sono A[2i+1] e A[2i+2], mentre per i > 0 il padre di A[i] è A[⌊(i−1)/2⌋]. Gli indici oltre la lunghezza corrente dell’heap non appartengono all’albero.
L’array [9, 7, 6, 4, 3, 1, 5, 2] rappresenta un max-heap: A[0]=9 domina 7 e 6; A[1]=7 domina 4 e 3; la stessa proprietà vale per ogni altro genitore.
La vista a barre mostra scambi e parte ordinata; la rappresentazione parallela collega ogni posizione dell’array al nodo corrispondente del max-heap.
Da 2 a 16 valori. Per questo simulatore sono ammessi valori da 0 a 999.
heapSort(A) buildMaxHeap(A) for end ← length(A) − 1 downto 1 swap A[0], A[end] siftDown(A, 0, end)buildMaxHeap(A) for root ← ⌊length(A) / 2⌋ − 1 downto 0 siftDown(A, root, length(A))siftDown(A, root, end) while 2 · root + 1 < end left ← 2 · root + 1 right ← left + 1 largest ← root if A[left] > A[largest]: largest ← left if right < end and A[right] > A[largest]: largest ← right if largest = root: return swap A[root], A[largest] root ← largestLa riga evidenziata corrisponde all’operazione descritta nel simulatore. I dettagli di gestione degli indici sono intenzionalmente semplificati.
La fase di estrazione esegue n−1 ripristini del heap, ciascuno fino a log n livelli: Θ(n log n) anche nel caso migliore standard.
Build-heap costa Θ(n); le estrazioni dominano con Θ(n log n).
L’altezza del heap è sempre Θ(log n), quindi il limite peggiore resta Θ(n log n).
Gli scambi avvengono nello stesso array e la versione iterativa usa Θ(1) spazio. Gli scambi a lunga distanza distruggono la stabilità.
La stabilità riguarda l’ordine relativo degli elementi con chiave uguale.
La classificazione considera la versione dell’algoritmo mostrata in questa pagina.
Utile quando si vuole una garanzia Θ(n log n) con memoria ausiliaria costante; alla base anche delle code di priorità.
Costruire il heap con n inserimenti costa Θ(n log n); il build-heap bottom-up corretto costa Θ(n).