Lalgoritmo 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 (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)
Spiegazione Lidea è fondere fra loro due sottosequenze già ordinate Occorre un vettore ausiliario di destinazione B (oppure due vettori ausiliari L e R in cui copiare le origini) La procedura di fusione è la chiave: –Si confrontano gli elementi di testa delle due sottosequenze –Si trascrive lelemento minore nel vettore B –Si reitera il procedimento, sinché le due sottosequenze sono entrambe vuote
La procedura Merge Sequenze: –A1: –A2: –B: Step 3: –A1: _ –A2: _ _ 5 7 –B: Step 6: –A1: _ _ _ 8 –A2: _ _ _ 7 –B: Step 1: –A1: –A2: _ –B: 1 Step 2: –A1: _ –A2: _ –B: 1 2 Step 4: –A1: _ _ 6 8 –A2: _ _ 5 7 –B: Step 5: –A1: _ _ 6 8 –A2: _ _ _ 7 –B: Step 7: –A1: _ _ _ 8 –A2: _ _ _ _ –B: Step 8: –A1: _ _ _ _ –A2: _ _ _ _ –B:
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) Analisi di complessità di MergeSort Nel seguito usiamo
Merge (A,s,m,d) For i 1 to n 1 do L[i] A[i + s – 1] For j 1 to n 2 do R[j] A[j + m] L[n 1 +1] R[n 2 +1] i j 1 For k s to d do If L[i] R[j] then A[k] L[i] i i + 1 else A[k] R[j] j j + 1 Analisi di complessità di Merge
Ne risulta che Merge ha complessità lineare
Complessità di MergeSort Per semplificare lanalisi, 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 dellindice 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)
Vedremo che T(n)= (n lg n) Complessità di MergeSort (2) Con lipotesi semplificativa n 1 = n 2 = n/2