Index
Related
Introduzione
L’algoritmo merge sort (ordinamento per fusione) è un algoritmo ricorsivo che adotta una tecnica algoritmica detta Divide et Impera.
Questo algoritmo utilizza due funzioni Merge Sort e una funzione Fondi.
Funzione Merge Sort
Funzionamento Generale
L’approccio dell’algoritmo Merge Sort è il seguente:
- Divide: la sequenza di n elementi viene divisa in due sotto sequenze di elementi ciascuna.
- Impera: le due sotto sotto sequenze di elementi vengono ordinate ricorsivamente.
- Passo base: la ricorsione termina quando la sotto sotto sequenza è costituita di un solo elemento, per cui è già ordinata.
- Combina: le due sotto sequenze (ormai ordinate) di elementi, vengono “fuse” in una sequenza ordinata di elementi.
Input & Output
Gli input della funzione
MergeSort
sono:
A
: Lista che deve essere ordinata.low
: L’indice di inizio della porzione della lista che deve essere ordinata. Ad esempio, selow = 0
verrà ordinata la lista dall’inizio.high
: L’indice di fine della porzione della lista che deve essere ordinata. Ad esempio, sehigh = len(A) - 1
verrà ordinata la lista fino alla fine.L’output della funzione
MergeSort
non è un valore di ritorno, ma piuttosto un effetto collaterale: modifica la listaA
in loco, ordinando gli elementi tra gli indicilow
ehigh
inclusi. Dopo l’esecuzione della funzione, la porzione diA
dalow
ahigh
sarà ordinata in ordine crescente. df [!info] Codice
def MergeSort(A, low, high): # T(n), tempo totale
if low < high: # θ(1) mid = (low + high)//2 # θ(1) MergeSort(A, low, mid) # T(n/2), tempo per ordinare la prima metà MergeSort(A, mid + 1, high) # T(n/2), tempo per ordinare la seconda metà fondi(A, low, mid, high) # S(n), tempo per fondere le due metà
Costo Computazionale
Funzione Fondi
Funzionamento generale
La funzione sfrutta il fatto che le due sotto sequenze sono ordinate;
- l minimo della sequenza complessiva non può che essere il più piccolo fra i minimi delle due sottosequenze (se essi sono uguali, scegliere l’uno o l’altro non fa differenza);
- dopo aver eliminato da una delle due sotto sequenze tale minimo, la proprietà rimane: il prossimo minimo non può che essere il più piccolo fra i minimi delle due parti rimanenti delle due sotto sequenze, ecc.
Input & Output
Gli input della funzione
fondi
sono:
A
: Questa è la lista che deve essere ordinata. La listaA
dovrebbe essere già ordinata in due parti: dalow
amid
e damid+1
ahigh
.
low
: Questo è l’indice di inizio della prima parte ordinata della lista.
mid
: Questo è l’indice di fine della prima parte ordinata della lista e l’indice di inizio della seconda parte ordinata èmid+1
.
high
: Questo è l’indice di fine della seconda parte ordinata della lista.La funzione
fondi
fonde queste due parti ordinate in una singola parte ordinata. Dopo l’esecuzione della funzione, la listaA
sarà ordinata dall’indicelow
all’indicehigh
.
Codice
Costo Computazionale
Costi singole parti:
- Inizializzazione delle variabili: ====
- Primo ciclo: Ogni iterazione ha costo e il numero possibili di iterazione varia da a . Quindi il costo è al massimo ====
- Secondo e terzo ciclo: I due cicli (mai eseguiti entrambi), che inseriscono eventuali elementi rimanenti in
B
, vengono eseguiti al massimon
volte in totale. Quindi, il costo è ====- L’ultimo ciclo for: Copia gli elementi ordinati da
B
aA
, viene eseguiton
volte. Quindi, il costo è ====Costo Complessivo: