Bubble sort base | ||
Bubble sort ottimizzato |
Bubble sort |
|
Complessità |
Se in una scansione del vettore non si effettuano scambi, significa che il vettore è ordinato.
Si chiama ordinamento a bolla perché dopo la prima scansione del vettore, l'elemento massimo si porta in ultima posizione (gli elementi più piccoli salgono come "bolle" verso le posizioni iniziali del vettore).
void bubbleSort(vector v, int start, int end)
{
int swap, i, temp;
swap = FALSE;}
for (i = start; i < end; i++) {if (v[i] > v[i+1]) {}
swap = TRUE;
temp = v[i];
v[i] = v[i+1];
v[i+1] = temp;
}
if (swap) bubbleSort(v, start, end-1);
Esempio d'uso
Scrivi 5 numeri interi: 9 3 2 6 7
9 3 2 6 7
3 2 6 7 9
2 3 6 7 9
2 3 6 7 9
Il vettore ordinato è: 2 3 6 7 9
Nota: l'ultimo passaggio è inutile!!
Ad ogni iterazione si esclude la parte finale del vettore (che è certamente già ordinata).
void bubble(vector v, int start, int end) {
int i, swap = start-1, temp;
for (i = start; i < end; i++) {}if (v[i] > v[i+1]) {}
swap = i;
temp = v[i];
v[i] = v[i+1];
v[i+1] = temp;
}if (swap > start) bubble(v, start, swap);
Esempio d'uso
Scrivi 5 numeri interi: 9 3 2 6 7
9 3 2 6 7
3 2 6 7 9
2 3 6 7 9
Il vettore ordinato è: 2 3 6 7 9
L'ultimo passaggio inutile è stato eliminato.
Caso migliore: Vettore già ordinato.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
time = 2 * S in-1 (n- i) = n*(n-1) = O(n2)
Caso medio: Vettore ordinato a caso
Comparo il primo elemento con gli altri n-1 elementi. L'algoritmo compirà
n-1 passi per muovere il più piccolo elemento in cima alla lista.
Il secondo elemento è comparato con gli altri n-2 elementi perchè
il primo non lo tocco più. Qui si compiranno n-2 passi per portare
il più piccolo elemento trovato nel secondo posto della lista.
Estendendo questo processo all'intera lista si avranno:
(n-1)+(n-2)+(n-3)+...+1 = n(n-1)/2 passi.
Ad esempio con un array di 16 elementi si avranno 16 x 15 / 2 = 120
passi.
Il bidirectional bubble sort della Sun
E' semplicemente un bubble sort leggermente ottimizzato in modo da avere
due ordinamenti contemporaneamente: uno che comincia da sopra e uno da
sotto.
Il tutto è realizzato con due cicli for invece che con uno:
for (j = st; j < limit; j++) e for (j = limit; --j >= st;). Ecco il listato e la pagina di Sun con l'applet.