Bubble Sort in Python

Thu 14 April 2022

Hai bisogno di ordinare un elenco di elementi omogenei (ad esempio numeri) all'interno di una lista in Python? Non sai che algoritmo utilizzare?

Se il tuo elenco non ha dimensioni enormi allora puoi utilizzare l'algoritmo di ordinamento Bubble Sort.

Il Bubble Sort, o algoritmo a bolla, è l'algoritmo più lento e meno efficiente tra tutti gli algoritmi utilizzabili per l'ordinamento. Tuttavia la sua logica molto intuitiva e la semplicità nella realizzazione software, lo eleggono a buon candidato nei casi nei quali abbiamo bisogno di un algoritmo rapido per ordinare piccole liste di elementi.

Strategia

La strategia di ordinamento dell'algoritmo Bubble Sort prevede lo spostamento, ad ogni iterazione, dell'elemento più grande della lista nell'ultima posizione considerata (target_index).

Alla prima iterazione è spostato in ultima posizione l'elemento più grande della lista, alla seconda iterazione è spostato il secondo elemento più grande, alla terza il terzo e così via.

Questa strategia richiede nel caso peggiore O(n²) e pertanto, per come abbiamo visto nell'articolo sulla notazione Big O, le presentazioni decadono al crescere della dimensione dell'input.

Tale algoritmo dovrebbe essere usato solamente con input molto piccoli.

Algoritmo

L'algoritmo di ordinamento Bubble Sort si basa su n-1 iterazioni necessarie per ordinare una lista di n elementi.

L'obiettivo di ogni singola iterazione è quello di portare nell'ultima posizione (target_index) l'elemento con il valore maggiore. Il target_index è l'ultima posizione della corrente iterazione. Il BubbleSort è composto da n-1 iterazioni ed ogni iterazione sposta il target_index di una posizione verso sinistra (decrementa l'indice).

Volendo ordinare una lista di 6 elementi [20,10,40,50,60,2] (che in Python saranno nelle posizioni da 0 a 5) avremo le seguenti iterazioni:

Iterazione Elementi considerati target_index Elemento spostato Lista
0 - - - [20,10,40,50,60,2]
1 6 5 60 [20,10,40,50,2,60]
2 5 4 50 [20,10,40,2,50,60]
3 4 3 40 [20,10,2,40,50,60]
4 3 2 20 [10,2,20,40,50,60]
5 2 1 10 [2,10,20,40,50,60]

La logica è quindi quella di spostare alla fine della lista l'elemento maggiore e, successivamente, non considerare più la cella ormai contenente l'elemento desiderato della lista.

Implementazione

L'implementazione dell'algoritmo Bubble Sort in Python è la seguente:

def bubble_sort(elements):
    target_index = len(elements) - 1
    for indexes in range(target_index, 0, -1):
        for index in range(indexes):
            element = elements[index]
            next_element = elements[index + 1]
            if element > next_element:
                elements[index] = next_element
                elements[index + 1] = element
    return elements

La precedente funzione prende come input una lista di elementi e restituisce la lista ordinata secondo l'algoritmo Bubble Sort.

Per invocare la funzione eseguire:

ordered_elements = bubble_sort([20, 19, 18, 17, 16, 15])
# ordered_elements memorizza la lista di elementi ordinati

Prestazioni

L'algoritmo Bubble Sort necessita di eseguire n-1 iterazioni ed eseguire x-1 confronti dove x rappresenta la posizione finale della lista da ordinare, per ogni iterazione.

Per tale motivo, nel caso peggiore, le prestazioni dell'algoritmo sono O(n²).

Conclusioni

Nell'articolo hai potuto vedere cos'è l'algoritmo di ordinamento Bubble Sort, come implementarlo e come utilizzarlo. L'algoritmo rappresenta una scelta nelle occasioni dove abbiamo la necessità di ordinare un numero esiguo di dati omogenei presenti su una lista Python.

Ulteriori algoritmi di ordinamento