Menu
Coddy logo textTech

Insertion sort

Ultimo aggiornamento

L'insertion sort costruisce l'array ordinato un elemento alla volta. Prende il prossimo elemento non ordinato (la "chiave"), sposta di una posizione a destra ogni elemento più grande della zona ordinata e poi inserisce la chiave nello spazio libero. È esattamente il modo in cui la maggior parte delle persone ordina le carte da gioco in mano. Premi play qui sopra per vedere ogni chiave inserita, o segui gli spostamenti uno alla volta.

L'insertion sort è molto veloce su input piccoli o quasi ordinati (richiede O(n) quando i dati sono già ordinati), ed è per questo che molti ordinamenti ibridi ricorrono a esso per i sottoarray piccoli.

Complessità temporale e spaziale

CasoComplessitàNote
Caso miglioreO(n)Già ordinato
Caso medioO(n²)Ordine casuale
Caso peggioreO(n²)Ordinato al contrario
SpazioO(1)In loco
StabileSìGli elementi uguali mantengono il loro ordine relativo

Passo dopo passo

PassoCosa succede
1Considera il primo elemento come una zona ordinata di dimensione uno.
2Prendi l'elemento successivo come chiave.
3Sposta di una posizione a destra ogni elemento ordinato più grande della chiave.
4Inserisci la chiave nello spazio che si è aperto.
5Ripeti finché ogni elemento non è stato inserito.

Esempio svolto

Ordinamento di [5, 2, 4, 1]:

PassataArrayAzione
Inizio[5, 2, 4, 1]5 è la zona ordinata iniziale di dimensione uno.
1[2, 5, 4, 1]Chiave 2: sposta 5 a destra, inserisci 2 in testa.
2[2, 4, 5, 1]Chiave 4: sposta 5 a destra, 2 è più piccolo quindi fermati, inserisci 4.
3[1, 2, 4, 5]Chiave 1: sposta 5, 4, 2 a destra, inserisci 1 in testa.
Fine[1, 2, 4, 5]Tutti gli elementi sono inseriti; l'array è ordinato.

Quando usare l'insertion sort

Usalo quandoEvitalo quando
L'array è piccolo (più o meno n < 20).L'array è grande e in ordine casuale.
I dati sono già quasi ordinati, e ottieni il caso migliore O(n).Ti serve un caso peggiore O(n log n) garantito.
Ti serve un ordinamento stabile e in loco con O(1) di spazio extra.Spostare gli elementi è costoso, perché fa molti spostamenti.
I dati arrivano poco alla volta e devono restare ordinati in tempo reale.L'input è ordinato al contrario, il suo caso peggiore O(n²).

Codice Insertion Sort

Un'implementazione di Insertion Sort pulita ed eseguibile in Python, JavaScript, Java, C++, C, Pseudocode. Scegli un linguaggio, copia il codice o aprilo già caricato nel Playground di Coddy.

Codice Insertion Sort in Python

Python
1def insertion_sort(a):2    for i in range(1, len(a)):3        key = a[i]4        j = i - 15        # Shift larger elements one slot to the right6        while j >= 0 and a[j] > key:7            a[j + 1] = a[j]8            j -= 19        a[j + 1] = key10    return a11
12
13nums = [7, 3, 9, 1, 5, 8, 2]14print("Before:", nums)15insertion_sort(nums)16print("After: ", nums)
Esegui questo codice nel playground Python

Domande frequenti sull'insertion sort

Qual è la complessità temporale dell'insertion sort?
L'insertion sort è O(n²) in media e nel caso peggiore, ma O(n) su un array già ordinato o quasi ordinato. Usa O(1) di spazio extra.
L'insertion sort è stabile?
Sì. L'insertion sort sposta solo gli elementi strettamente maggiori della chiave, quindi gli elementi uguali non si scavalcano mai e il loro ordine relativo viene preservato.
Quando conviene usare l'insertion sort?
Usalo per array piccoli o dati già quasi ordinati. Grazie al suo basso overhead e al caso migliore adattivo, algoritmi ibridi come Timsort lo usano per le sequenze piccole.
Qual è la differenza tra insertion sort e bubble sort?
Sono entrambi ordinamenti per confronto O(n²), ma l'insertion sort sposta gli elementi per aprire uno spazio per la chiave, mentre il bubble sort scambia ripetutamente le coppie adiacenti fuori ordine. L'insertion sort di solito fa meno scritture e in pratica rende meglio, soprattutto su dati quasi ordinati dove raggiunge il suo caso migliore O(n).
Perché l'insertion sort è più veloce del merge sort sugli array piccoli?
L'insertion sort ha un overhead costante molto basso e nessuna ricorsione né allocazione extra, quindi su input piccoli batte gli ordinamenti O(n log n) nonostante la sua complessità asintotica peggiore. È proprio per questo che ordinamenti ibridi come Timsort e introsort passano all'insertion sort per i sottoarray piccoli.
L'insertion sort funziona meglio con una lista concatenata o con un array?
L'insertion sort di solito si scrive per gli array, dove spostare gli elementi è il costo principale. Su una lista concatenata eviti gli spostamenti agganciando il nodo al suo posto, ma perdi l'accesso casuale veloce, quindi trovare il punto di inserimento richiede comunque tempo lineare per ogni elemento e il costo complessivo resta O(n²).
Illustrazione dei linguaggi di programmazione di Coddy

Padroneggia gli algoritmi con Coddy

INIZIA