Technopedia Center
PMB University Brochure
Faculty of Engineering and Computer Science
S1 Informatics S1 Information Systems S1 Information Technology S1 Computer Engineering S1 Electrical Engineering S1 Civil Engineering

faculty of Economics and Business
S1 Management S1 Accountancy

Faculty of Letters and Educational Sciences
S1 English literature S1 English language education S1 Mathematics education S1 Sports Education
teknopedia

teknopedia

teknopedia

teknopedia

teknopedia

teknopedia
teknopedia
teknopedia
teknopedia
teknopedia
teknopedia
  • Registerasi
  • Brosur UTI
  • Kip Scholarship Information
  • Performance
  1. Weltenzyklopädie
  2. Insertion sort - Teknopedia
Insertion sort - Teknopedia
Insertion sort
Esempio di ordinamento di una lista di numeri casuali.
ClasseAlgoritmo di ordinamento
Struttura datiArray
Caso peggiore temporalmente O ( n 2 ) {\displaystyle O(n^{2})} {\displaystyle O(n^{2})}
Caso ottimo temporalmente O ( n ) {\displaystyle O(n)} {\displaystyle O(n)}
Caso medio temporalmente O ( n 2 ) {\displaystyle O(n^{2})} {\displaystyle O(n^{2})}
Caso peggiore spazialmente O ( n ) {\displaystyle O(n)} {\displaystyle O(n)} totale
O ( 1 ) {\displaystyle O(1)} {\displaystyle O(1)} ausiliaria
OttimaleSì (nel caso di inserimento di alcuni valori in una lista quasi ordinata) altrimenti No
Manuale
Esempio grafico dell'insertion sort.

L'Insertion sort, in italiano ordinamento a inserimento, è un algoritmo relativamente semplice per ordinare un array. Non è molto diverso dal modo in cui un essere umano, spesso, ordina un mazzo di carte. Esso è un algoritmo in place, cioè ordina l'array senza doverne creare una copia, risparmiando memoria. Pur essendo molto meno efficiente di algoritmi più avanzati, può avere alcuni vantaggi: ad esempio, è semplice da implementare ed è efficiente per insiemi di partenza che sono quasi ordinati.

Descrizione dell'algoritmo

[modifica | modifica wikitesto]

L'algoritmo solitamente ordina la sequenza sul posto. Si assume che la sequenza da ordinare sia partizionata in una sottosequenza già ordinata, all'inizio composta da un solo elemento, e una ancora da ordinare. Alla k {\displaystyle k} {\displaystyle k}-esima iterazione, la sequenza già ordinata contiene k {\displaystyle k} {\displaystyle k} elementi. In ogni iterazione, viene rimosso un elemento dalla sottosequenza non ordinata (scelto, in generale, arbitrariamente) e inserito (da cui il nome dell'algoritmo) nella posizione corretta della sottosequenza ordinata, estendendola così di un elemento.

Per fare questo, un'implementazione tipica dell'algoritmo utilizza due indici: uno punta all'elemento da ordinare e l'altro all'elemento immediatamente precedente. Se l'elemento puntato dal secondo indice è maggiore di quello a cui punta il primo indice, i due elementi vengono scambiati di posto; altrimenti il primo indice avanza. Il procedimento è ripetuto finché si trova nel punto in cui il valore del primo indice deve essere inserito. Il primo indice punta inizialmente al secondo elemento dell'array, il secondo inizia dal primo. L'algoritmo così tende a spostare man mano gli elementi maggiori verso destra.

Pseudocodice

[modifica | modifica wikitesto]

Seguono gli pseudocodici per diversi algoritmi dell'insertion sort. Si assume che la numerazione degli elementi negli array inizi da 0.

Algoritmo iterativo

[modifica | modifica wikitesto]
 function insertionSortIterativo(array A)
     for i ← 1 to length[A] do
        value ← A[i]
        j ← i-1
        while j >= 0 and A[j] > value do
             A[j + 1] ← A[j]
             j ← j-1
        A[j+1] ← value;

Algoritmo ricorsivo

[modifica | modifica wikitesto]

Per ordinare un array di dimensione n, A[0..n-1], si ordina prima il sotto-array A[0..n-2] e poi si inserisce l'n-1-esimo elemento. Il sotto-array di un elemento (n==1) è già ordinato.

 function insertionSortRicorsivo(array A, int n)
     if n>1
        insertionSortRicorsivo(A,n-1)
        value ← A[n-1]
        j ← n-2
        while j >= 0 and A[j] > value 
         do A[j + 1] ← A[j]
            j ← j-1
        A[j+1] ← value

Algoritmo per linguaggi funzionali

[modifica | modifica wikitesto]
 insert :: Ord a => a -> [a] -> [a]
 insert item []  = [item]
 insert item (h:t) | item <= h = item:h:t
                   | otherwise = h:(insert item t)

 insertsort :: Ord a => [a] -> [a]
 insertsort []    = []
 insertsort (h:t) = insert h (insertsort t)

Esempio di funzionamento

[modifica | modifica wikitesto]
Simulazione dell'insertion sort su un array

Di seguito sono mostrati i passi compiuti dall'algoritmo per ordinare la sequenza [3, 7, 4, 9, 5, 2, 6, 1]. In ogni passo, l'elemento sottolineato è quello considerato, mentre quello in grassetto è l'elemento spostato nel passo precedente.

3 7 4 9 5 2 6 1

3 7 4 9 5 2 6 1

3 7 4 9 5 2 6 1

3 4 7 9 5 2 6 1

3 4 7 9 5 2 6 1

3 4 5 7 9 2 6 1

2 3 4 5 7 9 6 1

2 3 4 5 6 7 9 1

1 2 3 4 5 6 7 9

Analisi delle prestazioni

[modifica | modifica wikitesto]

Il caso ottimo per l'algoritmo è quello in cui la sequenza di partenza sia già ordinata. In questo caso, l'algoritmo ha tempo di esecuzione lineare, ossia Θ ( n ) {\displaystyle \Theta (n)} {\displaystyle \Theta (n)}. Infatti, in questo caso, in ogni iterazione il primo elemento della sottosequenza non ordinata viene confrontato solo con l'ultimo della sottosequenza ordinata. Il caso pessimo è invece quello in cui la sequenza di partenza sia ordinata al contrario. In questo caso, ogni iterazione dovrà scorrere e spostare ogni elemento della sottosequenza ordinata prima di poter inserire il primo elemento della sottosequenza non ordinata. Pertanto, in questo caso l'algoritmo di insertion sort ha complessità temporale quadratica, ossia Θ ( n 2 ) {\displaystyle \Theta (n^{2})} {\displaystyle \Theta (n^{2})}. Anche il caso medio ha complessità quadratica, il che lo rende impraticabile per ordinare sequenze grandi. Pur avendo complessità elevata, tuttavia, risulta essere l'algoritmo di ordinamento più veloce per array piccoli. Un algoritmo simile all'Insertion Sort ma dalla complessità minore è lo Shell sort. Anche lo shell sort non è in grado di competere con la combinazione dell'insertion sort con un algoritmo di tipo divide et impera, quale il quick sort o il merge sort, ossia all'uso dell'algoritmo divide et impera per ridurre il problema all'ordinamento di sequenze di dimensione inferiore a una certa soglia, che verranno trattate con l'insertion sort.

Bibliografia

[modifica | modifica wikitesto]
  • Thomas Cormen, Charles E. Leiserson, Ronald Rivest, Introduction, in Introduction to Algorithms, 2ª ed., Cambridge, Massachusetts, The MIT Press, 1998.

Altri progetti

[modifica | modifica wikitesto]

Altri progetti

  • Wikibooks
  • Wikimedia Commons
  • Collabora a Wikibooks Wikibooks contiene implementazioni dell'insertion sort
  • Collabora a Wikimedia Commons Wikimedia Commons contiene immagini o altri file sull'insertion sort

Collegamenti esterni

[modifica | modifica wikitesto]
  • (EN) Denis Howe, Insertion sort, in Free On-line Dictionary of Computing. Disponibile con licenza GFDL
V · D · M
Algoritmi di ordinamento
TeoriaTeoria della complessità computazionale · Notazione O Grande · Array · Lista · Stack · Coda · Ordinamento comparativo · Ordinamento adattivo
Algoritmi a scambioBubble sort · Shaker sort · Odd-even sort · Comb sort · Gnome sort · Quicksort
Algoritmi di selezioneSelection sort · Heap sort · Smoothsort
Algoritmi ad inserimentoInsertion sort · Shell sort · Tree sort · Library sort · Patience sorting
Algoritmi a fusioneMerge sort · Timsort
Algoritmi non comparativiRadix sort · Bucket sort · Counting sort · Pigeonhole sort
Altri algoritmiRete di ordinamento · Ordinamento topologico · Ordinamento bitonico · Ordinamento delle frittelle
Algoritmi inefficientiStupid sort · Trippel sort
  Portale Informatica: accedi alle voci di Teknopedia che trattano di informatica
Estratto da "https://it.wikipedia.org/w/index.php?title=Insertion_sort&oldid=143747868"

  • Indonesia
  • English
  • Français
  • 日本語
  • Deutsch
  • Italiano
  • Español
  • Русский
  • فارسی
  • Polski
  • 中文
  • Nederlands
  • Português
  • العربية
Pusat Layanan

UNIVERSITAS TEKNOKRAT INDONESIA | ASEAN's Best Private University
Jl. ZA. Pagar Alam No.9 -11, Labuhan Ratu, Kec. Kedaton, Kota Bandar Lampung, Lampung 35132
Phone: (0721) 702022