Shell sort: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m fix link a sezioni inesistenti |
→Collegamenti esterni: Aggiunto il template "Collegamenti esterni" Etichette: Modifica da mobile Modifica da applicazione mobile Modifica da applicazione Android |
||
(42 versioni intermedie di 33 utenti non mostrate) | |||
Riga 1:
{{Algoritmo
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]].▼
|classe = [[Algoritmo di ordinamento]]
È veloce, facile da comprendere e da implementare.▼
|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]].
▲
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 spostando i valori di più posizioni per volta man mano che risistema i valori, diminuendo gradualmente la dimensione del passo sino ad arrivare ad uno.
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 di un array dati di lunghezza ''n''. Usando l'insertion sort, ci vorranno circa ''n'' confronti e scambi per spostare questo valore lungo tutto l'array fino all'altra estremità. Con lo Shell sort, si muoveranno i valori usando passi di grosse dimensioni, cosicché un valore piccolo andrà velocemente nella sua posizione finale con pochi confronti e scambi.
L'idea dietro lo Shell sort può essere illustrata nel seguente modo:
#
#
#
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 numero di colonne ''h'' più basso. Nell'ultima passata, l'array è composto da una singola colonna(''h''=1) trasformando di fatto
Ad ogni passata i dati diventano sempre più ordinati, finché, durante l'ultima lo diventano del tutto. Comunque, il numero di operazioni di ordinamento necessarie in ciascuna passata è limitato, a causa dell'ordinamento parziale ottenuto nelle passate precedenti.
Line 42 ⟶ 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'ultima passata, sono solamente un 6, un 8 ed un 9 che devono essere spostati leggermente per arrivare a destinazione.
Line 48 ⟶ 56:
== Analisi ==
La
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.
Line 56 ⟶ 64:
([[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 67 ⟶ 77:
</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, ...).
==
<references />
{{interprogetto|b=Algoritmi/Shell sort|b_oggetto=implementazioni|b_preposizione=di}}▼
== Bibliografia ==
* D.L.Shell: A high-speed sorting procedure. Communications of the ACM 2 (7), 30-32 (
* D.E.Knuth: Sorting and Searching, vol. 3 of The Art of Computer Programming. Addison-Wesley (
* R.Sedgewick: Algorithms. Addison-Wesley (
== Altri progetti ==
▲{{interprogetto|b=
== 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ì }}
*
{{Ordinamento}}
[[Categoria:Algoritmi di ordinamento]]▼
{{Portale|informatica}}
▲[[Categoria:Algoritmi di ordinamento]]
|