Menu
Coddy logo textTech

Sortowanie przez wstawianie (insertion sort)

Ostatnia aktualizacja

Sortowanie przez wstawianie buduje posortowaną tablicę element po elemencie. Bierze następny nieposortowany element ("klucz"), przesuwa każdy większy element z posortowanej części o jedno pole w prawo, a potem wstawia klucz w powstałą lukę. Dokładnie tak większość ludzi układa karty w ręce. Kliknij odtwarzanie powyżej i zobacz, jak każdy klucz jest wstawiany, albo przechodź przez przesunięcia po jednym.

Sortowanie przez wstawianie jest bardzo szybkie dla małych lub prawie posortowanych danych: działa w O(n), gdy dane są już posortowane, dlatego wiele hybrydowych algorytmów sortowania korzysta z niego przy małych podtablicach.

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

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

Krok po kroku

KrokCo się dzieje
1Potraktuj pierwszy element jako posortowaną część o rozmiarze jeden.
2Weź następny element jako klucz.
3Przesuń każdy posortowany element większy od klucza o jedno pole w prawo.
4Wstaw klucz w powstałą lukę.
5Powtarzaj, aż wszystkie elementy zostaną wstawione.

Przykład krok po kroku

Sortowanie [5, 2, 4, 1]:

PrzebiegTablicaDziałanie
Start[5, 2, 4, 1]5 to początkowa posortowana część o rozmiarze jeden.
1[2, 5, 4, 1]Klucz 2: przesuń 5 w prawo, wstaw 2 na początek.
2[2, 4, 5, 1]Klucz 4: przesuń 5 w prawo, 2 jest mniejsze, więc stop, wstaw 4.
3[1, 2, 4, 5]Klucz 1: przesuń 5, 4, 2 w prawo, wstaw 1 na początek.
Koniec[1, 2, 4, 5]Wszystkie elementy wstawione; tablica jest posortowana.

Kiedy używać sortowania przez wstawianie

Używaj, gdyUnikaj, gdy
Tablica jest mała (mniej więcej n < 20).Tablica jest duża i ma losową kolejność.
Dane są już prawie posortowane, co daje najlepszy przypadek O(n).Potrzebujesz gwarantowanego O(n log n) w najgorszym przypadku.
Potrzebujesz stabilnego sortowania w miejscu z O(1) dodatkowej pamięci.Przenoszenie elementów jest kosztowne, bo algorytm wykonuje wiele przesunięć.
Dane napływają stopniowo i muszą być na bieżąco posortowane.Dane są posortowane odwrotnie, co jest jego najgorszym przypadkiem O(n²).

Insertion Sort: kod

Przejrzysta, gotowa do uruchomienia implementacja algorytmu Insertion 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.

Insertion Sort: kod (Python)

Python
1def insertion_sort(a):2    for i in range(1, len(a)):3        key = a[i]4        j = i - 15        # Shift larger elements one slot to the right6        while j >= 0 and a[j] > key:7            a[j + 1] = a[j]8            j -= 19        a[j + 1] = key10    return a11
12
13nums = [7, 3, 9, 1, 5, 8, 2]14print("Before:", nums)15insertion_sort(nums)16print("After: ", nums)
Uruchom ten kod w edytorze Python online

Sortowanie przez wstawianie: najczęstsze pytania

Jaka jest złożoność czasowa sortowania przez wstawianie?
Sortowanie przez wstawianie ma złożoność O(n²) w średnim i najgorszym przypadku, ale O(n) dla tablicy już posortowanej lub prawie posortowanej. Zużywa O(1) dodatkowej pamięci.
Czy sortowanie przez wstawianie jest stabilne?
Tak. Sortowanie przez wstawianie przesuwa tylko elementy ściśle większe od klucza, więc równe elementy nigdy się nie mijają, a ich względna kolejność zostaje zachowana.
Kiedy używać sortowania przez wstawianie?
Używaj go dla małych tablic lub danych, które są już prawie posortowane. Dzięki niskiemu narzutowi i adaptacyjnemu najlepszemu przypadkowi algorytmy hybrydowe, takie jak Timsort, używają go dla krótkich serii.
Czym różni się sortowanie przez wstawianie od sortowania bąbelkowego?
Oba to sortowania przez porównania o złożoności O(n²), ale sortowanie przez wstawianie przesuwa elementy, aby zrobić lukę dla klucza, a sortowanie bąbelkowe wielokrotnie zamienia sąsiednie pary w złej kolejności. Sortowanie przez wstawianie zwykle wykonuje mniej zapisów i w praktyce działa lepiej, zwłaszcza na prawie posortowanych danych, gdzie osiąga najlepszy przypadek O(n).
Dlaczego sortowanie przez wstawianie jest szybsze od merge sort dla małych tablic?
Sortowanie przez wstawianie ma bardzo mały narzut stały i nie używa rekurencji ani dodatkowej alokacji, więc dla małych danych pokonuje algorytmy O(n log n) mimo gorszej złożoności asymptotycznej. Właśnie dlatego hybrydowe algorytmy sortowania, takie jak Timsort i introsort, przełączają się na sortowanie przez wstawianie dla małych podtablic.
Czy sortowanie przez wstawianie lepiej działa na liście jednokierunkowej czy na tablicy?
Sortowanie przez wstawianie pisze się zwykle dla tablic, w których głównym kosztem jest przesuwanie elementów. Na liście jednokierunkowej unikasz przesuwania, wpinając węzeł na miejsce, ale tracisz szybki dostęp swobodny, więc znalezienie miejsca wstawienia nadal zajmuje czas liniowy na element, a łączny koszt pozostaje O(n²).
Ilustracja języków programowania w Coddy

Opanuj algorytmy z Coddy

ZACZNIJ