Menu
Coddy logo textTech

Bubble sort

Ultimo aggiornamento

Il bubble sort scorre ripetutamente la lista, confronta ogni coppia di elementi adiacenti e li scambia se sono nell'ordine sbagliato. Dopo ogni passata completa, il valore più grande rimasto è "salito come una bolla" fino alla sua posizione corretta in fondo, quindi ogni passata esamina un elemento in meno. Premi play qui sopra per vedere confronti e scambi, o seguili uno alla volta.

È uno degli algoritmi di ordinamento più facili da capire, e questo lo rende un ottimo primo algoritmo, ma il suo tempo di esecuzione O(n²) lo rende poco pratico per input grandi.

Complessità temporale e spaziale

CasoComplessitàNote
Caso miglioreO(n)Già ordinato, con un controllo di uscita anticipata
Caso medioO(n²)Ordine casuale
Caso peggioreO(n²)Ordinato al contrario
SpazioO(1)In loco, solo una variabile temporanea
StabileSìGli elementi uguali mantengono il loro ordine relativo

Passo dopo passo

PassoCosa succede
1Parti dall'inizio dell'array.
2Confronta l'elemento corrente con il successivo.
3Se sono fuori ordine, scambiali.
4Spostati di una posizione a destra e ripeti fino alla fine (una passata).
5Ripeti le passate; ogni passata fissa un altro elemento in fondo.
6Fermati quando una passata completa non fa scambi.

Esempio svolto

Ordinamento di [5, 2, 4, 1]:

PassataArrayAzione
1[2, 4, 1, 5]Scambia 5,2, poi 5,4, poi 5,1; 5 sale fino in fondo.
2[2, 1, 4, 5]2,4 in ordine; scambia 4,1; 4,5 in ordine; ora 4 è al suo posto.
3[1, 2, 4, 5]Scambia 2,1; il resto è già in ordine; 2 è al suo posto.
4[1, 2, 4, 5]Una passata completa non fa scambi, quindi l'array è ordinato e l'algoritmo si ferma.

Quando usare il bubble sort

Usalo quandoEvitalo quando
Insegni o impari come funzionano gli ordinamenti per confrontoOrdini input grandi, dove O(n²) è decisamente troppo lento
L'input è minuscolo o quasi ordinato (con l'uscita anticipata si avvicina a O(n))Ti serve l'ordinamento generico più veloce: usa quicksort o merge sort
Ti serve un ordinamento stabile e in loco con pochissimo codiceI dati sono in ordine casuale e le prestazioni contano
Vuoi scoprire con una sola passata se una lista corta è già ordinataMolte scritture sono costose (ad es. memoria flash); il selection sort fa meno scambi

Codice Bubble Sort

Un'implementazione di Bubble Sort pulita ed eseguibile in Python, JavaScript, Java, C++, C, Pseudocode. Scegli un linguaggio, copia il codice o aprilo già caricato nel Playground di Coddy.

Codice Bubble Sort in Python

Python
1def bubble_sort(a):2    n = len(a)3    for i in range(n - 1):4        swapped = False5        for j in range(n - 1 - i):6            if a[j] > a[j + 1]:7                a[j], a[j + 1] = a[j + 1], a[j]8                swapped = True9        if not swapped:10            break  # no swaps means the list is already sorted11    return a12
13
14nums = [5, 1, 4, 2, 8]15print("Before:", nums)16bubble_sort(nums)17print("After: ", nums)
Esegui questo codice nel playground Python

Domande frequenti sul bubble sort

Qual è la complessità temporale del bubble sort?
Il bubble sort richiede tempo O(n²) nel caso medio e peggiore a causa dei cicli annidati. Con l'ottimizzazione dell'uscita anticipata può arrivare a O(n) su un array già ordinato. Usa O(1) di spazio extra.
Il bubble sort è stabile?
Sì. Il bubble sort scambia elementi adiacenti solo quando sono strettamente fuori ordine, quindi gli elementi uguali non si scavalcano mai e mantengono il loro ordine relativo originale.
Perché si chiama bubble sort?
A ogni passata il valore più grande non ancora ordinato si sposta passo dopo passo verso la fine dell'array, come una bolla che sale in superficie: da qui il nome "bubble" (bolla).
Qual è la differenza tra bubble sort e insertion sort?
Entrambi richiedono O(n²) e sono stabili e in loco, ma spostano i dati in modo diverso: il bubble sort scambia ripetutamente coppie adiacenti fuori ordine, mentre l'insertion sort prende ogni elemento e lo fa scorrere all'indietro fino al suo posto nel prefisso ordinato. L'insertion sort di solito fa meno scritture ed è più veloce in pratica, soprattutto su dati quasi ordinati.
Quando conviene usare il bubble sort invece del quicksort?
Quasi mai per carichi di lavoro reali: il tempo medio O(n log n) del quicksort schiaccia l'O(n²) del bubble sort su qualsiasi input che non sia minuscolo. Il bubble sort vale la pena solo quando la lista è molto piccola o quasi ordinata, o quando vuoi l'ordinamento stabile più semplice possibile per insegnare.
L'ottimizzazione dell'uscita anticipata cambia il caso peggiore del bubble sort?
No. Tenere traccia degli scambi fatti in una passata permette al bubble sort di fermarsi prima e arrivare a O(n) su input già ordinati, ma un array ordinato al contrario richiede comunque tutti i confronti, quindi il caso peggiore resta O(n²). L'ottimizzazione aiuta solo nel caso migliore e in quelli quasi ordinati.
Illustrazione dei linguaggi di programmazione di Coddy

Padroneggia gli algoritmi con Coddy

INIZIA