5.1 Definicja sortowania bąbelkowego
Sortowanie bąbelkowe (Bubble Sort) — to prosty algorytm sortowania, który wielokrotnie przechodzi przez listę, porównując sąsiednie elementy i zamieniając je miejscami, jeśli są w złej kolejności. Ten proces trwa do momentu, aż lista będzie w pełni posortowana.
Zasada działania:
- Algorytm przechodzi przez listę i porównuje każdą parę sąsiednich elementów.
- Jeśli elementy są w złej kolejności (pierwszy większy od drugiego dla sortowania rosnącego) — są zamieniane miejscami.
- Ten proces jest powtarzany dla wszystkich par elementów na liście.
- Po każdym pełnym przejściu największy element „wypływa” na swoje miejsce (jak bąbel na powierzchni wody), i dlatego nie bierze już udziału w kolejnych przejściach.
- Proces trwa, aż lista zostanie posortowana.
Złożoność czasowa i przestrzenna sortowania bąbelkowego
Złożoność czasowa:
- W najgorszym wypadku:
O(n^2)— występuje, gdy elementy są początkowo uporządkowane w odwrotnej kolejności. - W średnim wypadku:
O(n^2)— występuje dla losowego rozmieszczenia elementów. - W najlepszym wypadku:
O(n)— występuje, gdy elementy są już posortowane (algorytm można zoptymalizować dla tego przypadku, dodając sprawdzenie, czy nastąpiła zamiana elementów w czasie przejścia).
Złożoność przestrzenna:
O(1) — ponieważ algorytm używa stałej ilości dodatkowej pamięci (tylko kilka zmiennych do przechowywania wartości tymczasowych).
5.2 Implementacja algorytmu
Algorytm „sortowania bąbelkowego” — to najprostszy i najbardziej prymitywny algorytm sortowania listy/array elementów. Po prostu porównuje elementy parami i zamienia je miejscami, jeśli trzeba.
Wersja 1:
array = [6, 43, 2, 1, 2, 1, 1, 1, 1, 6, 7, 8]
n = len(array)
for i in range(n):
for j in range(n - 1): if array[j] > array[j + 1]: array[j], array[j + 1] = array[j + 1], array[j] # Wymiana elementów
print("Posortowana tablica:", array)
# Wyjście: Posortowana tablica: [1, 1, 1, 1, 1, 2, 2, 6, 6, 7, 8, 43]
Wewnętrzna pętla (wyróżniona na zielono) porównuje element z jego sąsiadem po prawej. I jeśli trzeba — zamienia elementy miejscami.
Wersja 2:
Do naszego algorytmu można od razu dodać optymalizację: po pierwszym przejściu algorytmu największy element znajdzie się na końcu, więc nie można go już uwzględniać w kolejnej pętli.
Po drugiej iteracji z prawej strony będą już 2 największe elementy, więc wewnętrzną pętlę można prowadzić nie do n - 1, ale do n - 1 - i. Gdzie i — to liczba wykonanych iteracji zewnętrznej pętli.
Nowy wariant będzie wyglądał tak:
array = [6, 43, 2, 1, 2, 1, 1, 1, 1, 6, 7, 8]
n = len(array)
for i in range(n):
for j in range(n - 1 - i): if array[j] > array[j + 1]: array[j], array[j + 1] = array[j + 1], array[j] # Wymiana elementów
print("Posortowana tablica:", array)
# Wyjście: Posortowana tablica: [1, 1, 1, 1, 1, 2, 2, 6, 6, 7, 8, 43]
Wersja 3:
Również tablica może być już prawie posortowana. Dlatego można dodać taką optymalizację: jeśli wewnętrzna pętla przeszła przez wszystkie elementy, ale nie wykonała żadnej wymiany, to sortowanie jest zakończone.
W tej wersji używa się zmiennej swapped, która śledzi, czy doszło do wymiany elementów podczas ostatniego przejścia. Jeśli po przejściu przez tablicę nie nastąpiła żadna wymiana, oznacza to, że tablica jest już posortowana i dalsze iteracje są bezcelowe — nie poprawią sortowania. W ten sposób zmienna swapped pozwala znacznie przyspieszyć działanie algorytmu na prawie posortowanych tablicach, kończąc jego wykonywanie wcześniej.
Implementacja sortowania bąbelkowego w Pythonie:
def bubble_sort(array):
n = len(array)
for i in range(n):
swapped = False # Optymalizacja: sprawdzenie, czy nastąpiła wymiana
for j in range(0, n - i - 1): if array[j] > array[j + 1]: array[j], array[j + 1] = array[j + 1], array[j] # Wymiana elementów
swapped = True
if not swapped:
break # Jeśli nie było wymian, tablica jest już posortowana
return array
# Przykład użycia:
array = [64, 34, 25, 12, 22, 11, 90]
sorted_array = bubble_sort(array)
print("Posortowana tablica:", sorted_array)
# Wyjście: Posortowana tablica: [11, 12, 22, 25, 34, 64, 90]
GO TO FULL VERSION