Wszystkie zagadnienia: Algorytmy
podstawowy selection sortmatura podstawowa z informatyki

Sortowanie przez wybór

Wybiera minimum z nieposortowanej części i umieszcza je na właściwej pozycji. O(n²).

01

Opis

Sortowanie przez wybór układa liczby, szukając za każdym razem najmniejszej. Najpierw znajdujesz najmniejszą liczbę w całej tablicy i stawiasz ją na początku. Potem szukasz najmniejszej z tego, co zostało, i stawiasz ją na drugim miejscu. I tak dalej, aż wszystko będzie po kolei.

Ważna cecha: w każdym przejściu robisz tylko jedną zamianę – dopiero gdy już wiesz, gdzie leży najmniejsza liczba. Dlatego zamian jest bardzo mało, nawet jeśli porównań dużo.

Kiedy się przydaje: przy małych tablicach albo tam, gdzie zależy nam, żeby jak najrzadziej przestawiać elementy (bo samo przestawianie bywa kosztowne).

Na maturze: zwykle chodzi o policzenie, ile jest porównań, a ile zamian – i właśnie tu widać, że zamian jest mało.

Wizualizacja

Prześledź krok po kroku, jak algorytm porządkuje tablicę. Porównywane elementy są podświetlone, a te, które trafiły na swoje docelowe miejsce, zmieniają kolor na zielony.

5
2
8
1
6
3

Naciśnij „Krok", aby wykonać jedną operację, albo „Auto", aby uruchomić całą animację.

02

Pseudokod

funkcja sortuj_przez_wybor(T, n):
  dla i od 0 do n - 2:
    min_idx ← i
    // szukamy najmniejszego w niesortowanej części
    dla j od i + 1 do n - 1:
      jeżeli T[j] < T[min_idx]:
        min_idx ← j
    // zamieniamy znaleziony minimalny z elementem na pozycji i
    pomocnicza ← T[i]
    T[i] ← T[min_idx]
    T[min_idx] ← pomocnicza
  zwróć T
03

Implementacja w Pythonie i C++

def sortowanie_przez_wybor(tablica):
    n = len(tablica)
    for i in range(n - 1):
        min_idx = i
        for j in range(i + 1, n):
            if tablica[j] < tablica[min_idx]:
                min_idx = j
        # zamiana elementów
        tablica[i], tablica[min_idx] = tablica[min_idx], tablica[i]
    return tablica

# Przykład użycia
dane = [64, 25, 12, 22, 11]
print(sortowanie_przez_wybor(dane))
# Wynik: [11, 12, 22, 25, 64]
04

Najczęściej zadawane pytania

Czy sortowanie przez wybór jest stabilne?

Nie – to algorytm niestabilny. Zamiana odbywa się od razu z elementem znalezionym jako minimum, bez sprawdzania, czy nie przeskakuje przy tym nad innym elementem o tej samej wartości, więc ich pierwotna kolejność może się zmienić.

Jaka jest złożoność czasowa sortowania przez wybór?

O(n²) – zarówno w najgorszym, średnim, jak i najlepszym przypadku. Liczba porównań (n(n-1)/2) nie zależy od tego, jak ułożone są dane wejściowe – algorytm zawsze przeszukuje całą nieposortowaną część tablicy w poszukiwaniu minimum.

Czy sortowanie przez wybór wymaga dodatkowej pamięci?

Nie – sortuje w miejscu i potrzebuje tylko O(1) dodatkowej pamięci, czyli jednej zmiennej pomocniczej do zamiany dwóch elementów.

Kiedy warto używać sortowania przez wybór?

Przy małych zbiorach danych, w celach edukacyjnych albo gdy zależy nam na jak najmniejszej liczbie zamian – wykonuje ich co najwyżej n - 1, co ma znaczenie, gdy sama operacja zamiany jest kosztowna.

Czym różni się sortowanie przez wybór od bąbelkowego?

Sortowanie przez wybór szuka minimum w nieposortowanej części i przenosi je na właściwe miejsce jedną zamianą na przebieg, więc zamian jest mało. Sortowanie bąbelkowe zamienia natomiast sąsiednie elementy wielokrotnie w trakcie każdego przebiegu, więc zamian bywa znacznie więcej.

05

Ćwiczenie

Przeanalizuj sortowanie przez wybór i wpisz wyniki, potem kliknij Sprawdź.

Sortujemy rosnąco tablicę [5, 3, 8, 1, 2] (5 elementów). Algorytm wykonuje przebiegi (pętla zewnętrzna), a w pierwszym przebiegu (szukanie minimum całej tablicy) robi porównania. Znalezionym minimum jest liczba , więc po pierwszej zamianie tablica wygląda tak: .

Łączna liczba porównań przy sortowaniu tej 5-elementowej tablicy to , a zamian jest co najwyżej .

Uzupełnij tabelę (n to liczba elementów):

Liczba elementów nŁączna liczba porównań
4
6
8

Złożoność czasowa sortowania przez wybór w każdym przypadku to , a pamięciowa to .

Złożoność obliczeniowa

NajgorszyO(n²)
NajlepszyO(n²)
PamięciowaO(1)

Czasowa to zawsze O(n²) – niezależnie od przypadku (najgorszy, średni, najlepszy). Wynika to z dwóch zagnieżdżonych pętli: zewnętrzna wybiera kolejno pozycję do uzupełnienia (n przebiegów), a wewnętrzna przy każdym z nich przeszukuje całą pozostałą, nieposortowaną część tablicy w poszukiwaniu minimum (znowu do n porównań). O(n) razy O(n) daje O(n²) bez względu na to, czy dane wejściowe są już posortowane, czy ułożone od tyłu – liczba porównań jest stała i wynosi n(n-1)/2.

Zamian jest natomiast mało – co najwyżej n - 1. W przeciwieństwie do porównań, zamianę wykonujemy tylko raz na przebieg, dopiero po znalezieniu minimum, a nie przy każdym porównaniu. To mniej niż w większości klasycznych algorytmów sortujących – mniej zamian wykonuje tylko rzadko spotykane sortowanie cykliczne.

Pamięć O(1). Sortujemy w miejscu, w obrębie tej samej tablicy – potrzebna jest tylko jedna zmienna pomocnicza do zamiany dwóch elementów.

Dla większych zbiorów danych O(n²) wyraźnie przegrywa z algorytmami działającymi w czasie O(n log n), jak sortowanie szybkie czy sortowanie przez scalanie – różnica robi się odczuwalna już przy tablicach liczących tysiące elementów.

Przećwicz w zadaniach maturalnych

Do tego hasła nie mamy jeszcze przypisanych pojedynczych zadań. Cały spis zadań maturalnych z tego działu jest tutaj:

Zadania z działu: Programowanie

↗

Powiązane zagadnienia