NexTutor
Wirtualne laboratorium/Matematyka/Teoria grafów/Algorytmy sortowania — złożoność
Wielkie odkrycie 1945 — von Neumann

Algorytmy sortowania — złożoność

Rozszerzenie tematu złożoności obliczeniowej i funkcji (poza programem — informatyka). Proste sortowanie bąbelkowe wykonuje ~n² porównań, a sprytne (przez scalanie) ~n·log n — przy dużych n różnica jest ogromna (dla n=1000 to sto razy mniej operacji). Sortowanie przez scalanie opracował John von Neumann w 1945 r.

Matematyka · Teoria grafów · Algorytmy sortowania — złożoność (1945)
Liczba elementów do posortowania nn20 elem.
Efektywny algorytm sortuje n elementów w czasie rzędu…
elementów n
20
bąbelkowe ≈ n²
400
scalanie ≈ n·log n
86
ile razy mniej
×5

Co się właśnie stało?

Sortowanie — uporządkowanie danych rosnąco lub malejąco — to jedna z najczęstszych operacji w informatyce, a o wydajności decyduje wybór algorytmu. Zwiększyliśmy liczbę elementów do 1 000 i porównaliśmy dwie strategie: proste sortowanie bąbelkowe i sprytne sortowanie przez scalanie.

Złożoność obliczeniowa (notacja „duże O")

Złożoność opisuje, jak liczba operacji rośnie z rozmiarem danych nn. Proste algorytmy (bąbelkowe, przez wybieranie) porównują każdy element z każdym, więc wykonują ich rzędu:

O(n2)O(n^2)

Sprytne algorytmy — sortowanie przez scalanie (merge sort, opracowane przez Johna von Neumanna w 1945 r.) czy szybkie (quicksort) — dzięki strategii „dziel i zwyciężaj" (dziel dane na połowy, sortuj rekurencyjnie, scalaj posortowane części) osiągają:

O(nlogn)O(n\log n)

Dlaczego to tak ogromna różnica?

Dla małych n różnica jest niewielka. Ale dla n = 1000 to ~1 000 000 operacji (n2n^2) kontra ~10 000 (nlognn\log n) — sto razy mniej. Posortowanie miliona elementów algorytmem O(n2)O(n^2) wymaga bilionów operacji (godziny, a nawet dni), a O(nlogn)O(n\log n) — kilkudziesięciu milionów (ułamek sekundy). Wybór algorytmu decyduje o tym, czy program działa sekundy czy lata.

Fundament informatyki teoretycznej

Analiza złożoności pozwala przewidzieć, czy program da się w praktyce uruchomić, jeszcze zanim go napiszemy. To dlatego biblioteki standardowe (w Pythonie, Javie, C++) używają wewnątrz algorytmów rzędu nlognn\log n, a nie naiwnych pętli kwadratowych.

Po co Ci to na maturze:

Sam temat złożoności leży poza podstawą programową liceum (to pogranicze matematyki i informatyki), ale logarytmy i tempo wzrostu funkcji — owszem, są. Umiejętność porównania, jak n2n^2 rośnie szybciej niż nlognn\log n, to ta sama intuicja, której potrzebujesz przy zadaniach o funkcjach i ciągach.

Zapamiętaj: liczba operacji rośnie z n zgodnie ze złożonością algorytmu — bąbelkowe n2\sim n^2, scalanie nlogn\sim n\log n — a różnica narasta gwałtownie wraz z rozmiarem danych. Dlatego dobór algorytmu, a nie szybszy komputer, decyduje o tym, co da się policzyć.

Model poglądowy · Wirtualne laboratorium NexTutor

Najczęstsze pytania

W jakim czasie sortuje efektywny algorytm?

W czasie rzędu n·log n (np. sortowanie przez scalanie), znacznie szybciej niż n² (sortowanie bąbelkowe).

Co to złożoność obliczeniowa?

Opis, jak liczba operacji rośnie z rozmiarem danych n (notacja „duże O").

Kto opracował sortowanie przez scalanie?

John von Neumann, w 1945 r. — algorytm typu „dziel i zwyciężaj" o złożoności O(n·log n).