6.1 Definizione dell'ordinamento per inserzione
Ordinamento per inserzione (Insertion Sort) è un algoritmo di ordinamento che costruisce un array (o lista) ordinato uno elemento alla volta. Prende ogni elemento dalla parte non ordinata e lo inserisce nella posizione corretta della parte ordinata.
Principio di funzionamento:
- Iniziamo dal secondo elemento dell'array (il primo elemento è considerato ordinato).
- Confrontiamo l'elemento corrente con i precedenti e lo spostiamo a sinistra fino a trovare la posizione corretta.
- Ripetiamo il processo per tutti gli elementi dell'array, inserendo ogni nuovo elemento nel posto corretto della parte ordinata dell'array.
Complessità temporale e spaziale dell'ordinamento per inserzione
Complessità temporale:
- Nella peggiore delle ipotesi:
O(n^2)— accade quando gli elementi sono inizialmente ordinati in ordine inverso. - Nel caso medio:
O(n^2)— avviene per una disposizione casuale degli elementi. - Nella migliore delle ipotesi:
O(n)— avviene quando gli elementi sono già ordinati.
Complessità spaziale:
O(1) — poiché l'algoritmo utilizza una quantità costante di memoria aggiuntiva (solo alcune variabili per memorizzare valori temporanei).
6.2 Analisi del funzionamento dell'algoritmo
In ogni fase dell'algoritmo abbiamo la seguente situazione:
- Abbiamo un elemento corrente con indice
i. - Tutti gli elementi a sinistra di esso sono già ordinati dal minore al maggiore.
- Cerchiamo di
inserireil nostro elemento corrente nella parte ordinata dell'array in modo che l'ordine di ordinamento non venga interrotto.
Tentativo di inserire l'elemento nella parte ordinata dell'array appare così:
- La variabile
jnel ciclo assume valori dai - 1a0. - Se l'elemento corrente (i-esimo) è minore di quello j-esimo, allora spostiamo il valore dell'elemento j-esimo di 1 a destra.
Esempio: situazione corrente:
- Gli elementi evidenziati in verde sono già ordinati.
- In rosa — elementi che non sono ancora stati ordinati.
- L'elemento corrente all'indice 5 è evidenziato in marrone.
Proviamo a trovare il posto giusto per il nostro elemento corrente nella parte ordinata dell'array.
Passo 1 — memorizziamo il valore dell'elemento corrente nella variabile key.
Passo 2 — l'elemento No4 è maggiore di key? (10 è maggiore di 5?) Allora spostiamo l'elemento No4 a destra:
Passo 3 — l'elemento No3 è maggiore di key? (8 è maggiore di 5?) Allora spostiamo l'elemento No3 a destra:
Passo 4 — l'elemento No2 è maggiore di key? (6 è maggiore di 5?) Allora spostiamo l'elemento No2 a destra:
Passo 5 — l'elemento No1 è maggiore di key? (4 è maggiore di 5?) No. Allora mettiamo l'elemento key al posto dove era l'elemento No2.
Dopo aver inserito l'elemento No5 nel posto giusto, passiamo all'elemento No6 e cerchiamo di trovare la sua posizione nella parte ordinata dell'array:
Poi prendiamo il settimo elemento:
Poi l'ottavo:
6.3 Implementazione dell'algoritmo di ordinamento per inserzione
Ecco come appare questo algoritmo in Python:
def insertion_sort(arr):
# Passiamo attraverso tutti gli elementi dell'array, a partire dal secondo
for i in range(1, len(arr)):
key = arr[i]
j = i - 1 # Spostiamo gli elementi arr[0..i - 1], che sono maggiori del key, di una posizione avanti while j >= 0 and key < arr[j]: arr[j + 1] = arr[j] j -= 1
arr[j + 1] = key # Inseriamo il key nella posizione corretta
return arr # Ritorniamo l'array ordinato
# Esempio di utilizzo:
arr = [12, 11, 13, 5, 6]
sorted_arr = insertion_sort(arr)
print("Array ordinato:", sorted_arr)
# Output: Array ordinato: [5, 6, 11, 12, 13]
Spiegazione:
Memorizziamo l'elemento corrente in keySpostiamo tutti gli elementi della parte ordinata dell'array a destraInseriamo il nostro elemento nel posto adatto
Esempio di funzionamento dell'algoritmo
Prendiamo un esempio di array: [12, 11, 13, 5, 6]
1. Primo passaggio (i = 1):
- Confrontiamo 11 e 12, spostiamo 12 a destra.
- Array: [11, 12, 13, 5, 6]
2. Secondo passaggio (i = 2):
- 13 è già al suo posto.
- Array: [11, 12, 13, 5, 6]
3. Terzo passaggio (i = 3):
- Confrontiamo 5 con 13, 12 e 11, spostiamo tutti a destra.
- Array: [5, 11, 12, 13, 6]
4. Quarto passaggio (i = 4):
- Confrontiamo 6 con 13, 12 e 11, spostiamo tutti a destra.
- Array: [5, 6, 11, 12, 13]
L'algoritmo si conclude, poiché tutti gli elementi sono ordinati.
GO TO FULL VERSION