Merge sort
Il merge sort divide a metà l'array e riordina ricorsivamente le due parti per poi riunirle.
mergesort(Array A, int p, int r)
if p < r
med = (p + r)/2
mergesort(A, p, med)
mergesort(A, med+1, r)
merge(A, p, med, r)
merge(Array A, int p, int med, int r)
L = []
left_len = med - p + 1
for i = 1 to left_len
push(L, A[p + i-1])
R = []
right_len = r - med
for i = 1 to right_len
push(R, A[med + i])
i = 1, j = 1
for k = p to r
if i <= left_len and (j > right_len or L[i] <= R[j])
A[k] = L[i]
i++
else
A[k] = R[j]
j++
L'algoritmo è corretto per l'invariante dell'ultimo for
:
In
A[p..k-1]
sono ordinati elementi che, comeL[i]
eR[j]
, sono minori del resto diL
eR
e quando il for
termina k = r + 1
quindi l'invariante vale per A[p..r+1-1]
cioè l'intero array.
La complessità di merge
si può ricavare, sapendo che , da:
mentre quella di mergesort
è per il teorema master.
L'algoritmo è stabile ma non in loco, ed è migliorabile con l'insertion sort su array piccoli.