Anche un input ordinato attraversa log n livelli e ogni livello fonde complessivamente n elementi: Θ(n log n).
Algoritmi di ordinamento · 2/7
Merge sort
Divide l’array, ordina le metà e le fonde linearmente.
Come funziona
La ricorsione divide fino a sottosequenze di un elemento. La fusione confronta le teste di due metà già ordinate e copia ogni volta la più piccola in un buffer.
Simulazione passo passo
La vista a barre mostra confronti e copie; l’albero parallelo segue le suddivisioni dell’array e le successive fusioni.
Da 2 a 16 valori. Per questo simulatore sono ammessi valori da 0 a 999.
- Confronti
- 0
- Scritture
- 0
- Scambi
- 0
- Passaggio / livello
- 0
Pseudocodice collegato alla simulazione
Merge sort
mergeSort(A, left, right)if left ≥ right: returnmid ← ⌊(left + right) / 2⌋mergeSort(A, left, mid)mergeSort(A, mid + 1, right)merge(A, left, mid, right)
Merge
merge(A, left, mid, right)L ← A[left … mid]R ← A[mid + 1 … right]i ← 0; j ← 0; B ← empty arraywhile i < length(L) and j < length(R)if L[i] ≤ R[j]append L[i] to B; i ← i + 1elseappend R[j] to B; j ← j + 1append the remaining elements of L or R to Bfor k ← 0 to length(B) − 1A[left + k] ← B[k]
La riga evidenziata corrisponde all’operazione descritta nel simulatore. I dettagli di gestione degli indici sono intenzionalmente semplificati.
Studio della complessità
La forma dell’albero non dipende dall’ordine dei valori: T(n)=2T(n/2)+Θ(n)=Θ(n log n).
Gli stessi log n livelli e lo stesso lavoro lineare per livello danno una garanzia Θ(n log n).
La versione classica per array usa un buffer Θ(n) e uno stack Θ(log n). È stabile scegliendo dalla metà sinistra in caso di parità.
Proprietà in breve
La stabilità riguarda l’ordine relativo degli elementi con chiave uguale.
La classificazione considera la versione dell’algoritmo mostrata in questa pagina.
Quando usarlo e che cosa evitare
Buona scelta quando…
Scelta solida quando servono stabilità e garanzia, per liste collegate e per ordinamento esterno di dati che non entrano in memoria.
Errore comune
Una fusione che sceglie dalla metà destra sulle chiavi uguali rende l’algoritmo non stabile.