Menu
Coddy logo textTech

Selection sort (sortowanie przez wybieranie)

Ostatnia aktualizacja

Sortowanie przez wybieranie dzieli tablicę na posortowaną część po lewej i nieposortowaną po prawej. W każdym przebiegu przegląda nieposortowaną część, aby znaleźć najmniejszy element, a potem zamienia go na pierwszą nieposortowaną pozycję, powiększając posortowaną część o jeden. Kliknij odtwarzanie powyżej i zobacz przeglądanie i zamiany albo przechodź przez nie po jednym porównaniu.

Sortowanie przez wybieranie zawsze wykonuje tyle samo porównań niezależnie od danych, ale najwyżej n-1 zamian, czyli znacznie mniej niż sortowanie bąbelkowe, co może mieć znaczenie, gdy zapisy są kosztowne.

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

PrzypadekZłożonośćUwagi
Najlepszy przypadekO(n²)Porównania odbywają się nawet dla posortowanych danych
Średni przypadekO(n²)Losowa kolejność
Najgorszy przypadekO(n²)Posortowane odwrotnie
PamięćO(1)W miejscu
StabilneNieZamiany mogą zmienić kolejność równych elementów

Krok po kroku

KrokCo się dzieje
1Potraktuj całą tablicę jako nieposortowaną.
2Przejrzyj nieposortowaną część, aby znaleźć najmniejszy element.
3Zamień to minimum na pierwszą nieposortowaną pozycję.
4Przesuń granicę o jeden krok w prawo (to pole jest już posortowane).
5Powtarzaj, aż nieposortowany zostanie tylko jeden element.

Przykład krok po kroku

Sortowanie [5, 2, 4, 1]:

PrzebiegTablicaDziałanie
Start[5, 2, 4, 1]Cała tablica jest nieposortowana.
1[1, 2, 4, 5]Przejrzyj [5, 2, 4, 1], minimum to 1 pod indeksem 3; zamień je z indeksem 0.
2[1, 2, 4, 5]Przejrzyj [2, 4, 5], minimum to 2, już pod indeksem 1; zamiana z samym sobą.
3[1, 2, 4, 5]Przejrzyj [4, 5], minimum to 4, już pod indeksem 2; ruch niepotrzebny.
Koniec[1, 2, 4, 5]Zostało tylko 5, więc jest już na swoim miejscu.

Kiedy używać sortowania przez wybieranie

Używaj, gdyUnikaj, gdy
Zapisy są kosztowne: algorytm wykonuje najwyżej n-1 zamian.Tablica jest duża: dominuje O(n²) porównań.
Potrzebujesz prostego, łatwego w implementacji sortowania w miejscu.Potrzebujesz stabilnego sortowania, które zachowuje kolejność równych kluczy.
Pamięci jest mało: zużywa tylko O(1) dodatkowej pamięci.Dane są prawie posortowane: nie potrafi skończyć wcześniej jak sortowanie przez wstawianie.
Zbiór danych jest malutki i liczy się przewidywalna wydajność.Liczy się przepustowość: sortowania O(n log n), takie jak quicksort, są znacznie szybsze.

Selection Sort: kod

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

Selection Sort: kod (Python)

Python
1def selection_sort(a):2    n = len(a)3    for i in range(n - 1):4        # Find the smallest element in the unsorted tail5        min_idx = i6        for j in range(i + 1, n):7            if a[j] < a[min_idx]:8                min_idx = j9        a[i], a[min_idx] = a[min_idx], a[i]10    return a11
12
13nums = [64, 25, 12, 22, 11]14print("Before:", nums)15selection_sort(nums)16print("After: ", nums)
Uruchom ten kod w edytorze Python online

Selection sort: najczęstsze pytania

Jaka jest złożoność czasowa sortowania przez wybieranie?
Sortowanie przez wybieranie ma złożoność O(n²) w każdym przypadku, najlepszym, średnim i najgorszym, bo zawsze przegląda całą nieposortowaną część, aby znaleźć każde minimum. Zużywa O(1) dodatkowej pamięci.
Czy sortowanie przez wybieranie jest stabilne?
Standardowa wersja w miejscu nie jest stabilna, bo zamiana odległego minimum na jego miejsce może przenieść równy element za inny. Istnieje wariant stabilny, ale wymaga przesuwania zamiast zamieniania.
Kiedy sortowanie przez wybieranie jest przydatne?
Przydaje się, gdy koszt zapisu do pamięci jest wysoki, bo wykonuje najwyżej n-1 zamian, czyli minimum możliwe dla sortowania przez porównania, które przenosi elementy.
Czym różni się sortowanie przez wybieranie od sortowania bąbelkowego?
Oba to sortowania przez porównania o złożoności O(n²), ale sortowanie przez wybieranie wykonuje najwyżej n-1 zamian, a sortowanie bąbelkowe nawet O(n²) zamian. Sortowanie bąbelkowe potrafi też wykryć już posortowaną tablicę i zakończyć się wcześniej, a sortowanie przez wybieranie zawsze wykonuje pełną liczbę przebiegów.
Sortowanie przez wybieranie czy przez wstawianie: co wybrać?
W większości przypadków wybierz sortowanie przez wstawianie: jest stabilne, działa w O(n) na prawie posortowanych danych i jest średnio szybsze. Sortowanie przez wybieranie wybierz tylko wtedy, gdy priorytetem jest minimalna liczba zapisów, bo gwarantuje najwyżej n-1 zamian.
Dlaczego sortowanie przez wybieranie zawsze działa w O(n²), nawet na posortowanej tablicy?
Sortowanie przez wybieranie nie ma jak sprawdzić, że element jest już minimum, bez przejrzenia reszty nieposortowanej części, więc w każdym przebiegu wykonuje wszystkie porównania bez względu na kolejność danych. Oznacza to, że najlepszy przypadek równa się najgorszemu, O(n²), w przeciwieństwie do sortowania przez wstawianie czy bąbelkowego, które potrafią zakończyć się wcześniej.
Ilustracja języków programowania w Coddy

Opanuj algorytmy z Coddy

ZACZNIJ