Łapka LogoŁapka Infa
🫧

Sortowanie Bąbelkowe

Klasyk gatunku. Zobacz jak to działa na przykładzie układania książek i dlaczego jest takie wolne.

Sortowanie Bąbelkowe (Bubble Sort)

Wyobraź sobie, że masz na półce ciąg książek o różnej grubości i chcesz je ułożyć od najcieńszej do najgrubszej. Sortowanie bąbelkowe to najprostszy (choć nie najszybszy) sposób, żeby to zrobić.

Zasada jest banalna: porównujesz dwie sąsiednie książki. Jeśli ta po lewej jest grubsza od tej po prawej – zamieniasz je miejscami. I tak idziesz od początku do końca półki. Gdy dojdziesz do końca, największa (najgrubsza) książka na pewno "wypłynie" na sam koniec, zupełnie jak bąbelek powietrza w wodzie.

Potem zaczynasz od nowa, ignorując już ułożony koniec.

Implementacja

Zgodnie z wymogami maturalnymi, poniżej znajdziesz implementację w C++ oraz Pythonie.

C++

#include <iostream>
#include <vector>
using namespace std;

void bubbleSort(vector<int>& arr) {
    int n = arr.size();
    bool swapped;
    
    // Zewnętrzna pętla: ile razy musimy przejść przez tablicę
    for (int i = 0; i < n - 1; i++) {
        swapped = false;
        
        // Wewnętrzna pętla: porównuje sąsiednie elementy
        // n - i - 1, bo 'i' ostatnich elementów jest już na swoim miejscu
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(arr[j], arr[j + 1]); // Wbudowana funkcja zamiany
                swapped = true;
            }
        }
        
        // Optymalizacja: jeśli w całym przejściu nie było zamian, tablica jest posortowana
        if (!swapped) break;
    }
}

int main() {
    vector<int> liczby = {64, 34, 25, 12, 22, 11, 90};
    bubbleSort(liczby);
    
    for(int x : liczby) cout << x << " ";
    return 0;
}

Python

def bubble_sort(arr):
    n = len(arr)
    
    for i in range(n - 1):
        swapped = False
        
        for j in range(0, n - i - 1):
            if arr[j] > arr[j + 1]:
                # W Pythonie zamiana (swap) jest bardzo prosta
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
                swapped = True
                
        # Jeśli nic nie zamieniono, kończymy
        if not swapped:
            break

liczby = [64, 34, 25, 12, 22, 11, 90]
bubble_sort(liczby)
print(liczby)

🧠 Dla Dociekliwych

Dlaczego uczymy się optymalizacji ze zmienną swapped? Bez flagi swapped, algorytm zawsze wykona pełne $n \times n$ iteracji, nawet jeśli tablica od początku była idealnie posortowana! Z flagą swapped, dla posortowanej tablicy algorytm zatrzyma się po pierwszym przejściu, co daje nam złożoność optymistyczną $O(n)$.

Dlaczego na maturze zazwyczaj go unikamy? Jego złożoność czasowa w najgorszym przypadku to $O(n^2)$. Oznacza to, że dla 10 000 elementów komputer musi wykonać około 100 milionów operacji! Jeśli w zadaniu maturalnym masz do posortowania milion liczb z pliku, sortowanie bąbelkowe po prostu przekroczy limit czasu (tzw. TLE - Time Limit Exceeded). Do takich zadań lepiej użyć wbudowanego sort() (C++) lub .sort() (Python), które korzystają z szybszych algorytmów np. Quicksort lub Timsort ($O(n \log n)$).