Bubble sort: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m Annullate le modifiche di 91.253.240.126 (discussione), riportata alla versione precedente di 93.54.90.31 Etichetta: Rollback |
Ortografia |
||
(48 versioni intermedie di 33 utenti non mostrate) | |||
Riga 5:
|didascalia = Bubble sort in esecuzione
|struttura dati = [[Array]]
|tempo migliore = <math>O(n^2)</math>
Se si utilizza una guardia allora: <math>O(n)</math>
|tempo medio = <math>O(n^2)</math>
|tempo = <math>O(n^2)</math>
Riga 13 ⟶ 14:
}}
[[File:Bubblesort-edited-color.svg|alt=Bubble sort colore modificato|frame|Svolgimento dell'algoritmo Bubblesort, versione colorata]]
In [[informatica]] il '''Bubble sort''' o ''ordinamento a bolla'' è un semplice [[algoritmo di ordinamento]] di
{{Cita web
|url = https://stackoverflow.com/questions/tagged/bubble-sort
Riga 23 ⟶ 24:
== Denominazione ed efficienza ==
L'algoritmo deve il suo nome al modo in cui gli elementi vengono ordinati
Come tutti gli algoritmi di ordinamento, può essere usato per ordinare dati di
Il Bubble sort è più efficiente rispetto al più semplice algoritmo di Ordinamento Ingenuo perché, invece di continuare ad eseguire sempre fino alla fine i due cicli annidati, si interrompe
Dell'algoritmo esistono numerose [[#Varianti e ottimizzazioni|varianti]], per esempio lo [[shaker sort]].
== Spiegazione astratta ==
[[File:Bubble-sort-example-300px.gif|upright=1.6|thumb|Esempio di ''bubble sort'' che ordina gli elementi in senso crescente. Partendo dall'inizio della lista e scorrendola progressivamente, si confrontano due elementi adiacenti e si scambiano le loro posizioni se non sono nel giusto ordine (ossia se il secondo elemento è minore del primo). Dopo la prima [[iterazione]] il massimo si troverà in ultima posizione, quella sua definitiva; dopo la seconda iterazione il secondo massimo si troverà in penultima posizione, anch'essa la sua definitiva; dopo la terza iterazione il terzo massimo si troverà in terz'ultima posizione, anch'essa la sua definitiva e così via. Ad ogni iterazione almeno un elemento si va a collocare nella sua giusta posizione: la procedura termina quando non ci sono più elementi da scambiare. Si noti infine come, per esempio, l'8 sia un ''coniglio'' che si muove velocemente verso destra, mentre il 2 sia una ''tartaruga'' che si muove lentamente verso sinistra.]]
Il bubble sort è un [[algoritmo iterativo]], ossia basato sulla ripetizione di un procedimento fondamentale. La singola iterazione dell'algoritmo prevede che gli elementi dell'array siano confrontati a due a due, procedendo in un verso stabilito (che si scorra l'array a partire dall'inizio in avanti, o a partire dal fondo all'indietro, è irrilevante; d'ora in poi ipotizzeremo che lo si scorra partendo dall'inizio).
Per esempio, saranno confrontati il primo e il secondo elemento, poi il secondo e il terzo, poi il terzo e il quarto
Il motivo è semplice
15 6 4 10 11 2
Riga 52 ⟶ 53:
# se i numeri sono in tutto N, dopo N-1 iterazioni si avrà la garanzia che l'array sia ordinato;
#
Ovviamente, a ogni iterazione può accadere che più numeri vengano spostati;
=== Analisi dell'algoritmo ===
Riga 61 ⟶ 62:
=== Varianti e ottimizzazioni ===
Esistono numerose varianti del
Un insieme di ottimizzazioni si basa sull'osservazione che, se
Una seconda linea di ottimizzazione (che può essere combinata con la prima) è basata sull'osservazione che (sempre assumendo una scansione dell'array, per esempio, in avanti, e ordinamento crescente) se una data iterazione non sposta nessun elemento di posizione maggiore di un dato valore ''i'', allora si può facilmente dimostrare che
Un'altra variante già menzionata,
=== Conigli e tartarughe ===
Come detto, la struttura dell'algoritmo porta ad avere elementi che si spostano verso la posizione corretta più velocemente di altri. Tutti gli elementi che si spostano nella stessa direzione di scorrimento dell'indice avanzano più velocemente di quelli che lo fanno in senso contrario.
15 6 4 10 11 2
Riga 78 ⟶ 79:
6 4 10 11 2 15
Qui si osserva il "coniglio" 15 e la "tartaruga" 2: il primo numero, in una sola iterazione, ha attraversato tutta la lista, posizionandosi nella sua collocazione definitiva. Il secondo, invece, durante la stessa iterazione è avanzato di una sola posizione verso la sua collocazione corretta.
== Pseudocodice ==
Di seguito viene riportato
'''procedure''' BubbleSort(A''':'''lista degli elementi da ordinare)
Riga 89 ⟶ 90:
'''while''' scambio '''do'''
scambio ← false
'''for''' i ← 0 '''to''' length(A)-
'''if''' A[i] > A[i+1] '''then'''
swap( A[i], A[i+1] )
scambio ← true
Lo pseudocodice appena scritto sposta, ad ogni ciclo while, l'elemento più grande all'estrema destra.
Una versione alternativa potrebbe essere la seguente:
'''procedure''' BubbleSort(A''':'''lista degli elementi da ordinare)
'''for''' i ← 0 '''to''' length(A)-2 ''' do'''
'''for''' j ← i+1 '''to''' length(A)-1 ''' do'''
'''if''' A[j] < A[i] '''then'''
swap( A[j], A[i] )
Questa versione, invece, sposta, ad ogni ciclo for esterno, l'elemento più piccolo all'estrema sinistra.
=== Ottimizzazioni ===
Le prestazioni del bubble sort possono essere leggermente migliorate tenendo conto del fatto che dopo la prima iterazione l'elemento più grande si troverà certamente nell'ultima posizione della lista, quella sua definitiva; alla seconda iterazione il secondo più grande si troverà in penultima posizione, quella sua definitiva, e così via. Ad ogni iterazione il ciclo dei confronti può accorciarsi di un passo rispetto al precedente, evitando di scorrere ogni volta tutta la lista fino in fondo: all'n-esima iterazione si può quindi fare a meno di trattare gli ultimi n-1 elementi che ormai si trovano nella loro posizione definitiva.
'''procedure''' BubbleSort(A:lista di elementi da ordinare)
scambio ← true
n ← length'''(A)''' - 2 //poiché l'indice parte da 0 e devo fermarmi al penultimo elemento del vettore devo togliere 2
n ← length'''(A)''' - 2▼
'''while''' (scambio) '''do'''
scambio ← false
'''for''' i ← 0 '''to''' n
'''if''' (A[i] > A[i + 1]) '''then''' //sostituire '>' con '<' per ottenere un ordinamento decrescente
swap ( A[i], A[i+1] )
scambio ← true
n ← n-1 //ad ogni passaggio
Un altro tipo di ottimizzazione deriva dall'osservazione che spesso, alla fine di
'''procedure''' BubbleSort(A:lista di elementi da ordinare)
ultimoScambiato ← n
'''while''' (ultimoScambiato > 0) '''do'''
ultimoScambiato ← 0
Riga 121 ⟶ 134:
swap ( A[i], A[i+1] )
ultimoScambiato ← i
n ← ultimoScambiato //ad ogni passaggio si accorcia il ciclo
Il terzo pseudocodice accorcia ulteriormente, se possibile, il ciclo di for: mentre nello pseudocodice base ad ogni passaggio il ciclo si ripete sempre n-1 volte e nel secondo pseudocodice esso si accorcia progressivamente di
== Note ==
Riga 129 ⟶ 142:
== Voci correlate ==
* [[
* [[Shaker sort]]
* [[Stupid sort]]
== Altri progetti ==
{{interprogetto|b=Implementazioni di algoritmi/Bubble sort|b_oggetto=implementazioni|b_preposizione=
== Collegamenti esterni ==
* {{FOLDOC|2=bubble sort}}
* {{en}} [http://corte.si/posts/code/visualisingsorting/index.html Visualising Sorting Algorithms] - Visualizzazione grafica di alcuni algoritmi di ordinamento
* {{en}} [http://www.sorting-algorithms.com Sorting Algorithm Animations] - Animazione grafica di alcuni algoritmi di ordinamento
|