Zapisz się na listę

Sortowanie bąbelkowe a przez scalanie: różnice i złożoność

Bąbelkowe porównuje sąsiednie elementy i zamienia je miejscami, w pesymistycznym przypadku kwadratowo; przez scalanie dzieli tablicę na pół, sortuje połowy i je scala, zawsze w czasie n log n.

Różnica między tymi dwoma algorytmami nie jest różnicą szybkości implementacji — jest różnicą pomysłu. Sortowanie bąbelkowe poprawia tablicę lokalnie: przechodzi po niej wielokrotnie i za każdym razem zamienia miejscami sąsiadów stojących w złej kolejności. Sortowanie przez scalanie robi coś przeciwnego: nie poprawia niczego lokalnie, tylko rozbija problem na dwa mniejsze, rozwiązuje je tym samym sposobem i dopiero łączy wyniki.

Z tego bierze się złożoność. Bąbelkowe w najgorszym przypadku musi wykonać przebieg dla każdego elementu, a w każdym przebiegu porównać niemal wszystkie pary sąsiadów — liczba operacji rośnie więc z kwadratem liczby elementów. Przez scalanie dzieli tablicę na pół tyle razy, ile razy da się ją podzielić, czyli logarytmicznie względem jej długości, a na każdym poziomie podziału wykonuje pracę proporcjonalną do liczby elementów. Stąd iloczyn: liczba elementów razy logarytm z niej.

Cena za tę szybkość jest pamięciowa. Scalanie dwóch posortowanych fragmentów wymaga miejsca, w którym powstaje wynik, więc klasyczna wersja algorytmu potrzebuje dodatkowej tablicy wielkości danych wejściowych. Bąbelkowe pracuje w miejscu i nie potrzebuje praktycznie żadnej dodatkowej pamięci. Na maturze to rozróżnienie wraca w zadaniach o zasobach, nie tylko o czasie.

Jest też cecha, o którą zadania pytają wprost i która bywa zaskoczeniem: oba algorytmy są stabilne, to znaczy nie zmieniają wzajemnej kolejności elementów o równych kluczach — pod warunkiem że scalanie przy remisie bierze element z lewego fragmentu. Stabilność ma znaczenie, gdy dane sortuje się kolejno po kilku polach.

Sortowanie bąbelkowe a przez scalanie: porównanie w tabeli

KryteriumSortowanie bąbelkoweSortowanie przez scalanie
Zasadawielokrotne przejścia z zamianą sąsiadówpodział na pół, sortowanie połówek, scalanie
Złożoność czasowa — przypadek pesymistycznyproporcjonalna do kwadratu liczby elementówproporcjonalna do n log n
Złożoność czasowa — dane już posortowaneliniowa, jeśli algorytm przerywa po przebiegu bez zamianynadal n log n — podział zachodzi niezależnie od danych
Pamięć dodatkowastała — sortuje w miejscuproporcjonalna do liczby elementów
Rodzaj algorytmuiteracyjnyrekurencyjny, w schemacie dziel i zwyciężaj
Stabilnośćstabilnestabilne, gdy przy remisie wybiera element z lewej części
Kiedy ma sensbardzo małe zbiory, dane niemal posortowane, nauka mechanizmuduże zbiory, gdy gwarancja czasu jest ważniejsza niż pamięć

Gdzie najczęściej ginie punkt

  • Podanie samej nazwy złożoności bez uzasadnienia, gdy polecenie pytało, z czego ona wynika. Punkt jest za wskazanie liczby przebiegów i liczby porównań w przebiegu, nie za sam zapis.
  • Twierdzenie, że sortowanie przez scalanie jest szybsze zawsze. Dla kilku elementów narzut podziału i scalania bywa większy niż cały koszt bąbelkowego.
  • Pominięcie pamięci dodatkowej przy porównaniu algorytmów, gdy polecenie pytało o zasoby, a nie wyłącznie o czas.
  • Opis bąbelkowego jako „szukania najmniejszego elementu i przesuwania go na początek”. To jest sortowanie przez wybór — inny algorytm, inna liczba zamian.
Czego tu nie ma: treści zadań z arkuszy CKE, rozwiązań wzorcowych ani kluczy odpowiedzi. Ta strona opisuje własnymi słowami, czego dotyczy materiał i co sprawdzamy w Twoim rozwiązaniu. Zadania z arkuszy rozwiązuje się w aplikacji, po zalogowaniu.

Najczęstsze pytania

Kiedy sortowanie bąbelkowe działa w czasie liniowym?
Gdy dane są już posortowane, a algorytm kończy pracę po pierwszym przebiegu bez żadnej zamiany. Taki przebieg porównuje każdą parę sąsiadów raz, więc liczba operacji rośnie liniowo z liczbą elementów. Bez warunku przerwania algorytm wykonuje wszystkie przebiegi także na danych posortowanych.
Ile pamięci potrzebuje sortowanie przez scalanie?
Klasyczna wersja potrzebuje dodatkowej tablicy wielkości danych wejściowych, bo scalanie dwóch posortowanych fragmentów musi gdzieś zapisywać wynik. Pamięć dodatkowa rośnie więc proporcjonalnie do liczby elementów. Sortowanie bąbelkowe pracuje w miejscu i dodatkowej tablicy nie potrzebuje. Gdy polecenie pyta o zasoby, a nie tylko o czas, ta różnica musi trafić do odpowiedzi.
Czym sortowanie bąbelkowe różni się od sortowania przez wybór?
Sposobem przestawiania elementów. Sortowanie przez wybór w każdym przebiegu szuka najmniejszego elementu w nieuporządkowanej części tablicy i zamienia go z pierwszym elementem tej części, więc wykonuje co najwyżej jedną zamianę na przebieg. Bąbelkowe nie szuka minimum: porównuje sąsiadów i zamienia miejscami każdą parę stojącą w złej kolejności. Opis „szukam najmniejszego i przenoszę na początek” pasuje więc do sortowania przez wybór, nie do bąbelkowego.