Sortowanie bąbelkowe

1. Idea algorytmu

Sortowanie bąbelkowe (bubble sort) to najprostszy algorytm sortowania. Porównuje sąsiednie elementy i zamienia je, jeśli są w złej kolejności.

Nazwa:

Większe elementy "wypływają" na górę jak bąbelki w wodzie 🫧

Wizualizacja:

Iteracja 1: [5, 3, 8, 4, 2]
           [3, 5, 8, 4, 2]  5>3, zamiana
           [3, 5, 8, 4, 2]  5<8, OK
           [3, 5, 4, 8, 2]  8>4, zamiana
           [3, 5, 4, 2, 8]  8>2, zamiana → 8 na końcu!

Iteracja 2: [3, 5, 4, 2, 8]
           [3, 5, 4, 2, 8]  3<5, OK
           [3, 4, 5, 2, 8]  5>4, zamiana
           [3, 4, 2, 5, 8]  5>2, zamiana → 5 na końcu!

Iteracja 3: [3, 4, 2, 5, 8]
           [3, 4, 2, 5, 8]  3<4, OK
           [3, 2, 4, 5, 8]  4>2, zamiana → 4 na końcu!

Iteracja 4: [3, 2, 4, 5, 8]
           [2, 3, 4, 5, 8]  3>2, zamiana → POSORTOWANE!

2. Implementacja podstawowa

Krok po kroku:

  • Zewnętrzna pętla (i): n-1 przebiegów
  • Wewnętrzna pętla (j): porównania par
  • n - i - 1: Pomijamy już posortowane elementy z końca

3. Złożoność czasowa

Najgorszy przypadek: O(n²)

Lista w odwrotnej kolejności:

Liczba porównań:

Iteracja 1: 4 porównania
Iteracja 2: 3 porównania  
Iteracja 3: 2 porównania
Iteracja 4: 1 porównanie
Razem: 4 + 3 + 2 + 1 = 10 = n(n-1)/2 = O(n²)

Najlepszy przypadek: O(n²) (bez optymalizacji!)

Lista już posortowana:

Algorytm i tak wykona wszystkie porównania! (bez optymalizacji)

Średni przypadek: O(n²)


4. Optymalizacja 1: Wczesne zakończenie

Korzyść: Najlepszy przypadek teraz O(n)!


5. Wizualizacja z printami


6. Złożoność pamięciowa: O(1)

Bubble sort jest in-place!


7. Stabilność: TAK ✅

Bubble sort jest stabilny – zachowuje kolejność równych elementów.


8. Porównanie z innymi algorytmami


9. Kiedy używać bubble sort?

✅ Używaj gdy:

  • Małe dane (n < 20)
  • Dane prawie posortowane (z optymalizacją)
  • Prostota > wydajność
  • Celów edukacyjnych

❌ Unikaj gdy:

  • Duże dane (n > 100)
  • Wydajność krytyczna
  • Przypadkowe dane

10. Warianty bubble sort

10.1. Cocktail Shaker Sort (dwukierunkowe)

10.2. Comb Sort (ulepszona wersja)

Używa większego "gap" zamiast zawsze porównywać sąsiadów.


11. Licznik porównań i zamian


12. Podsumowanie

Bubble Sort:

  • Złożoność: O(n²) średnio, O(n) najlepiej (z optymalizacją)
  • Pamięć: O(1) in-place
  • Stabilny: TAK ✅
  • Prosty: Najłatwiejszy do zrozumienia

Zalety: - Bardzo prosty - Stabilny - In-place (O(1) pamięci) - Adaptywny (z optymalizacją)

Wady: - BARDZO wolny dla dużych danych (O(n²)) - Nie używany w praktyce - Dużo niepotrzebnych porównań

Kluczowa optymalizacja:

Kiedy używać:

  • Edukacja – najlepszy do nauki
  • Małe dane (< 20 elementów)
  • Prawie posortowane dane

W praktyce:

NIE używaj bubble sort dla produkcji – użyj sorted() lub quick/merge sort!

Co dalej warto poznać:

  • Selection Sort (podobna idea)
  • Insertion Sort (lepsza dla małych danych)
  • Quick Sort (praktyczny wybór)