Merge sort

Il merge sort fa parte degli algoritmi di sorting.

Input Sequenza di valori .

Output Permutazione della sequenza tale che

title: Attenzione
Come costo computazionale calcoliamo i confronti eseguiti tra i valori di A.

Questo algoritmo utilizza la tecnica Dividi et impera.

  1. Dividi: dividi l’array in due parti uguali
  2. Impera: ordina ogni array (quando c’è solo un elemento è già ordinato)
  3. Combina/merge: fondi le due metà ordinando gli elementi
MergeSort(A, i, j):
	if i < j then
		k := ⎣(i+j)/2⎦
		MergeSort(A, i, k)
		MergeSort(A, k+1, j)
		Merge(A, i, k, j)

Chiamata principale: MergeSort(A, 0, n-1)

Nello pseudo codice appena scritto si richiama una procedura dal nome Merge. Questa prende in input due porzioni ordinate dell’array A, e ne fa il merge ordinato.

Merge(A, i, k, j):
	l := i
	r := k + 1
	t := 0
	B := [0..j-i] nuovo array
	while l <= k AND r <= j do
		if A[l] <= A[r] then
			B[t] := A[l]
			l := l + 1
		else 
			B[t] := A[r]
			r := r + 1
		t := t + 1

	// se la parte sinistra ha degli elementi ancora, si devono spostare
	// se è la parte destra ad averli, si può fare a meno perchè verranno
	// spostati dopo
	r := j
	for h = k downto l do
		A[r] := A[h]
		r := r - 1

	// copio tutto il contenuto di B in A
	for h = i to t + i - 1 do
		A[i] := B[h-i]

Il while viene ripetuto volte, perchè si deve fare per tutti gli elementi. La copia viene eseguita su tutti gli elementi, quindi si ha un .

Utilizzando il master theorem per calcolare il costo computazionale di Merge, si ha:

con si ha , quindi il costo computazionale è di

Nessuno tra gli [[algoritmi di sorting]] che risolve il problema utilizzando confronti tra elementi può fare meglio di $O(n\log n)$. Si ha che quindi per un algoritmo di ordinamento, il lower bound è $\Omega(n\log n)$.

Miglioramenti

Dal momento che si utilizza anche un di spazio, e si fanno molte chiamate ricorsive, si può migliorare ulteriormente la velocità usando l’Insertion sort per il caso base (che diventa ), e per il resto continuare come sopra.

asd_13