Menu
Coddy logo textTech

Sortowanie bąbelkowe (bubble sort)

Ostatnia aktualizacja

Sortowanie bąbelkowe wielokrotnie przechodzi przez listę, porównuje każdą parę sąsiednich elementów i zamienia je, jeśli są w złej kolejności. Po każdym pełnym przebiegu największa pozostała wartość "wypływa" jak bąbelek na swoje miejsce na końcu, więc każdy kolejny przebieg sprawdza o jeden element mniej. Kliknij odtwarzanie powyżej i zobacz porównania i zamiany albo przechodź przez nie po jednym.

To jeden z najłatwiejszych do zrozumienia algorytmów sortowania, dlatego świetnie nadaje się na pierwszy algorytm, ale czas działania O(n²) czyni go niepraktycznym dla dużych danych.

Złożoność czasowa i pamięciowa

PrzypadekZłożonośćUwagi
Najlepszy przypadekO(n)Już posortowane, ze sprawdzeniem wczesnego wyjścia
Średni przypadekO(n²)Losowa kolejność
Najgorszy przypadekO(n²)Posortowane odwrotnie
PamięćO(1)W miejscu, tylko zmienna tymczasowa
StabilneTakRówne elementy zachowują względną kolejność

Krok po kroku

KrokCo się dzieje
1Zacznij od początku tablicy.
2Porównaj bieżący element z następnym.
3Jeśli są w złej kolejności, zamień je.
4Przesuń się o jedną pozycję w prawo i powtarzaj do końca (jeden przebieg).
5Powtarzaj przebiegi; każdy ustala kolejny element na końcu.
6Zakończ, gdy pełny przebieg nie wykona żadnej zamiany.

Przykład krok po kroku

Sortowanie [5, 2, 4, 1]:

PrzebiegTablicaDziałanie
1[2, 4, 1, 5]Zamień 5,2, potem 5,4, potem 5,1; 5 wypływa na koniec.
2[2, 1, 4, 5]2,4 w porządku; zamień 4,1; 4,5 w porządku; 4 jest na miejscu.
3[1, 2, 4, 5]Zamień 2,1; reszta jest już w porządku; 2 jest na miejscu.
4[1, 2, 4, 5]Pełny przebieg nie wykonuje zamian, więc tablica jest posortowana i algorytm się kończy.

Kiedy używać sortowania bąbelkowego

Używaj, gdyUnikaj, gdy
Uczysz (się), jak działają sortowania przez porównaniaSortujesz duże dane, dla których O(n²) jest zdecydowanie za wolne
Dane są malutkie lub prawie posortowane (z wczesnym wyjściem zbliża się do O(n))Potrzebujesz najszybszego sortowania ogólnego przeznaczenia: użyj quicksorta lub merge sort
Potrzebujesz stabilnego sortowania w miejscu przy minimalnej ilości koduDane mają losową kolejność, a liczy się wydajność
Chcesz w jednym przebiegu sprawdzić, czy krótka lista jest już posortowanaWiele zapisów jest kosztownych (np. pamięć flash); sortowanie przez wybieranie wykonuje mniej zamian

Bubble Sort: kod

Przejrzysta, gotowa do uruchomienia implementacja algorytmu Bubble Sort w językach: Python, JavaScript, Java, C++, C, Pseudocode. Wybierz język, skopiuj kod albo otwórz go od razu w edytorze online Coddy.

Bubble Sort: kod (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)
Uruchom ten kod w edytorze Python online

Sortowanie bąbelkowe: najczęstsze pytania

Jaka jest złożoność czasowa sortowania bąbelkowego?
Sortowanie bąbelkowe działa w czasie O(n²) w średnim i najgorszym przypadku z powodu zagnieżdżonych pętli. Z optymalizacją wczesnego wyjścia może osiągnąć O(n) dla już posortowanej tablicy. Zużywa O(1) dodatkowej pamięci.
Czy sortowanie bąbelkowe jest stabilne?
Tak. Sortowanie bąbelkowe zamienia sąsiednie elementy tylko wtedy, gdy są ściśle w złej kolejności, więc równe elementy nigdy się nie mijają i zachowują pierwotną względną kolejność.
Skąd nazwa sortowanie bąbelkowe?
W każdym przebiegu największa nieposortowana wartość przesuwa się krok po kroku w stronę końca tablicy, tak jak bąbelek unosi się na powierzchnię, stąd nazwa "bąbelkowe".
Czym różni się sortowanie bąbelkowe od sortowania przez wstawianie?
Oba działają w O(n²), są stabilne i sortują w miejscu, ale inaczej przenoszą dane: sortowanie bąbelkowe wielokrotnie zamienia sąsiednie pary w złej kolejności, a sortowanie przez wstawianie bierze każdy element i przesuwa go na właściwe miejsce w posortowanym początku tablicy. Sortowanie przez wstawianie zwykle wykonuje mniej zapisów i w praktyce działa szybciej, zwłaszcza na prawie posortowanych danych.
Kiedy użyć sortowania bąbelkowego zamiast quicksorta?
Przy prawdziwych obciążeniach prawie nigdy: średni czas O(n log n) quicksorta miażdży O(n²) sortowania bąbelkowego dla wszystkiego poza malutkimi danymi. Po sortowanie bąbelkowe warto sięgnąć tylko wtedy, gdy lista jest bardzo mała lub prawie posortowana albo gdy do nauki potrzebujesz najprostszego możliwego stabilnego sortowania.
Czy optymalizacja wczesnego wyjścia zmienia najgorszy przypadek sortowania bąbelkowego?
Nie. Śledzenie, czy przebieg wykonał jakąkolwiek zamianę, pozwala sortowaniu bąbelkowemu zakończyć się wcześniej i osiągnąć O(n) dla już posortowanych danych, ale tablica posortowana odwrotnie nadal wymaga wszystkich porównań, więc najgorszy przypadek pozostaje O(n²). Optymalizacja pomaga tylko w najlepszym przypadku i przy prawie posortowanych danych.
Ilustracja języków programowania w Coddy

Opanuj algorytmy z Coddy

ZACZNIJ