Shell sort: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Prima (maccheronica) traduzione dall'inglese. |
→Collegamenti esterni: Aggiunto il template "Collegamenti esterni" Etichette: Modifica da mobile Modifica da applicazione mobile Modifica da applicazione Android |
||
(77 versioni intermedie di 57 utenti non mostrate) | |||
Riga 1:
{{Algoritmo
|classe = [[Algoritmo di ordinamento]]
|immagine =Sorting shellsort anim2.gif
|struttura dati = [[Array]]
|tempo = O(''n''<sup>2</sup>)
|tempo migliore = O(''n'' log<sub>2</sub> ''n'')<ref>{{Cita web|titolo=Shellsort & Comparisons|url=http://www.cs.wcupa.edu/rkline/ds/shell-comparison.html|accesso=19 aprile 2016|dataarchivio=20 dicembre 2019|urlarchivio=https://web.archive.org/web/20191220040546/https://www.cs.wcupa.edu/rkline/ds/shell-comparison.html|urlmorto=sì}}</ref>
|tempo medio = dipende dai dati
|spazio = O(''n'')
|ottimale = No
|didascalia=Ordinamento di una sequenza numerica tramite lo shell sort}}
Lo '''Shell sort''' (o '''Shellsort''') è uno dei più vecchi [[Algoritmo di ordinamento|algoritmi di ordinamento]]. È stato ideato nel [[1959]] da [[D. L. Shell|Donald L. Shell]].
L'algoritmo è veloce, facile da comprendere e da implementare, ma è difficile analizzarne il tempo di esecuzione.
Lo Shell sort viene a volte chiamato "Shell-Metzner sort" in onore di Marlene Metzner che ne scrisse una primissima implementazione in [[FORTRAN]]. Venne per la prima volta chiamato Shell-Metzner in un articolo su
== Concetto base ==
Lo Shell sort è una estensione dell'[[insertion sort]], tenendo presenti due osservazioni:
# L'Insertion sort è efficiente se l'input è già abbastanza ordinato.
# L'Insertion sort è inefficiente, generalmente, in quanto muove i valori di una sola posizione per volta.
Lo Shell sort è simile all'insertion sort, ma funziona
Alla fine, lo Shell sort esegue un insertion sort, ma per allora i dati saranno già piuttosto ordinati.
[[File:Shell sorting algorithm color bars.svg|thumb|Algoritmo shell sort con barre di colore]]
Consideriamo un valore piccolo posizionato inizialmente all'estremità errata
L'idea dietro lo Shell sort può essere illustrata nel seguente modo:
# ripeti dal punto 1 con un diverso numero ''h'' (minore del precedente) fino a portare ''h'' ad 1
L'effetto finale è che la sequenza dei dati viene parzialmente ordinata. La procedura viene eseguita ripetutamente, ogni volta con un array più piccolo, cioè, con un
Ad ogni
== Esempio ==
Poniamo che
<pre>
Line 34 ⟶ 41:
8 4 2 0 6 1 5 -> 7 4 4 0 6 1 6
7 3 4 9 8 2 8 7 9 9 8 2</pre>
Gli elementi 8 e 9 sono ora arrivati in fondo alla sequenza, ma lì c'è anche un elemento piccolo (2) che non dovrebbe esserci.
<pre>
3 3 2 0 0 1
Line 43 ⟶ 50:
7 9 9 7 7 9
8 2 8 9
</pre>
Ora la sequenza è quasi completamente ordinata. Una volta organizzata su una sola colonna durante l'
In realtà, i dati non vengono inseriti in un array bidimensionale, ma vengono tenuti in un array monodimensionale indirizzato opportunamente. Per esempio, i dati alle posizioni 0, 5, 10, 15, etc. formerebbero la prima colonna di un array a cinque colonne. Le "colonne" ottenute con questo indirizzamento vengono ordinate tramite l'[[Insertion sort]], dal momento che questo metodo è piuttosto veloce con sequenze abbastanza ordinate.
== Analisi ==
La correttezza dell'algoritmo viene dal fatto che durante l'ultima passata (cioè per ''h'' = 1) un normale insertion sort viene eseguito sull'intero array.
Ma, visto che i dati vengono preordinati dalle passate precedenti (''h'' = 3, 7, 31, ...), una manciata di operazioni dell'insertion sort sono sufficienti. Il numero esatto dipende dalla sequenza dei valori ''h'' (noti come sequenze ''h''). La sequenza ''h'' sopracitata è solo una delle molte possibili.
([[Vaughan Pratt|Pratt]]) Con la sequenza ''h'' 1, 2, 3, 4, 6, 8, 9, 12, 16, ..., 2<sup>''p''</sup>3<sup>''q''</sup>, ... Shellsort esegue O(''n''·log(''n'')<sup>2</sup>) passi per ordinare una sequenza di lunghezza ''n''.
([[Thomas Hibbard|Hibbard]]) Con la sequenza ''h'' 1, 3, 7, 15, 31, 63, 127, ..., 2<sup>''k''</sup> - 1, ... Shellsort esegue O(''n''<sup>3/2</sup>) passi per ordinare una sequenza di lunghezza ''n''.
([[Donald Knuth|Knuth]]) Con la sequenza ''h'' 1, 4, 13, 40, 121, ..., 3''h''<sub>''s''-1</sub> + 1 = (3<sup>''s''</sup> - 1)/2, ... Shellsort esegue O(''n''<sup>3/2</sup>) passi per ordinare una sequenza di lunghezza ''n''.
(sequenza non definita) con la sequenza h 1, 8, 23, ..., 4i+1 + 3*2i +1, ... Shellsort esegue O (''n''<sup>4/3</sup>) passi per ordinare una sequenza di lunghezza n.
([[Robert Sedgewick|Sedgewick]]) Con la sequenza ''h'' 1, 5, 19, 41, 109, 209, ... (descritta qui sotto), Shellsort esegue O(''n''<sup>4/3</sup>) passi per ordinare una sequenza di lunghezza ''n''.
Line 63 ⟶ 71:
:<math>
h_s=
\
9 \cdot 2^s - 9 \cdot 2^{s/2} + 1 & \mbox{per }s\mbox{ pari} \\
\end{cases}
</math>
([[Insertion sort]]) Il caso peggiore dello Shell sort è l'insertion sort base (usando un passo ''h'' = 1), che richiede O(''n''
Una sequenza ''h'' facilmente computabile per lo Shell sort è la [[sequenza di Fibonacci]] (1, 2, 3, 5, 8, 13, 21, ... ) o il suo quadrato (1, 4, 9, 25, 64, ...).
== Note ==
<references />
== Bibliografia ==
* D.L.Shell: A high-speed sorting procedure. Communications of the ACM 2 (7), 30-32 (1959)
* D.E.Knuth: Sorting and Searching, vol. 3 of The Art of Computer Programming. Addison-Wesley (1973)
* R.Sedgewick: Algorithms. Addison-Wesley (1988)
== Altri progetti ==
{{interprogetto|b=Implementazioni_di_algoritmi/Shell_sort|b_oggetto=implementazioni|b_preposizione=dello|preposizione=sullo}}
== Collegamenti esterni ==
* {{Collegamenti esterni}}
* {{cita web | 1 = http://www.iti.fh-flensburg.de/lang/algorithmen/sortieren/shell/shellen.htm | 2 = Analisi dettagliata dello Shell sort (inglese) | accesso = 11 aprile 2005 | dataarchivio = 16 gennaio 2000 | urlarchivio = https://web.archive.org/web/20000116130927/http://www.iti.fh-flensburg.de/lang/algorithmen/sortieren/shell/shellen.htm | urlmorto = sì }}
* {{cita web|http://www.nist.gov/dads/HTML/shellsort.html|Dizionario degli Algoritmi e Strutture Dati: Shellsort (inglese)}}
{{Ordinamento}}
{{Portale|informatica}}
[[
|