L’algoritmo MergeSort Applica la strategia del “divide et impera” Divide: suddivide la sequenza di n elementi data in due sottosequenze di n/2 elementi Impera: ordina ricorsivamente le sottosequenze; quelle di lunghezza 1 rimangono inalterate (caso base) Combina: fonde (merge) le due sottosequenze per produrre la sequenza ordinata MergeSort (A,s,d) if s < d then m (s+d)/2 MergeSort (A,s,m) MergeSort (A,m+1,d) Merge(A,s,m,d)
Esempio 0 1 2 2 3 4 5 6 7 8 9 5 2 8 0 4 7 1 9 3 2 6 5 2 8 0 4 7 1 9 3 2 6 5 2 8 0 4 7 1 9 3 2 6 5 2 8 0 4 7 0 2 4 5 7 8 1 9 3 2 6 1 2 3 6 9 5 2 8 0 4 7 2 6 1 9 3 2 5 8 5 2 8 0 4 7 0 4 7 1 3 9 1 9 3 2 6 2 6 5 2 8 0 4 7 1 9 3 6 2 5 2 2 5 8 8 0 4 0 4 7 7 1 9 1 9 3 3 2 2 6 6 2 5 4 9 1 5 5 2 2 4 4 1 1 9 9
Analisi di complessità di MergeSort MergeSort (A,s,d) if s < d then m (s+d)/2 MergeSort (A,s,m) MergeSort (A,m+1,d) Merge (A,s,m,d) Si dimostra facilmente che
La procedura Merge L’idea è fondere fra loro due sottosequenze già ordinate Occorre un vettore ausiliario di destinazione B La procedura di fusione è la chiave: Si confrontano gli elementi di testa delle due sottosequenze Si trascrive l’elemento minore nel vettore B Si reitera il procedimento, sinché le due sottosequenze sono entrambe vuote
Esempio Sequenze: A1: 2 4 6 8 A2: 1 3 5 7 B: Step 1: A1: 2 4 6 8
Analisi di complessità di Merge Merge (A,s,m,d) is := s; id := m+1; i := 1; while is m and id d do if A[is] A[id] then B[i] := A[is]; is := is+1; i := i+1; else B[i] := A[id]; id := id+1; i := i+1; endwhile while is m do while id d do for i = s to d do A[i] := B[i-s+1]; Far notare che c1, c2 ecc… non sono gli stessi di MergeSort Ne risulta che Merge ha complessità lineare
Analisi di complessità di MergeSort MergeSort (A,s,d) If s < d then m (s+d)/2 MergeSort (A,s,m) MergeSort (A,m+1,d) Merge (A,s,m,d) Si dimostra facilmente che
Complessità di MergeSort Per semplificare l’analisi, consideriamo sequenze la cui lunghezza è una potenza di 2 i due sottoproblemi riguardano sottosequenze di ugual lunghezza Quando n = 1, il tempo di elaborazione è (1) Quando n > 1 Divide: calcolo dell’indice mediano della sequenza: (1) Impera: si risolvono ricorsivamente due sottoproblemi di dimensione n/2: 2T(n/2) Combina: si applica la procedura Merge a due sottosequenze di n/2 elementi: (n)
Complessità di MergeSort (2) Con l’ipotesi semplificativa n1 = n2 = n/2 Vedremo che T(n)= (n lg n)