Sortowanie przez wybieranie

1. Idea algorytmu

Sortowanie przez wybieranie (selection sort) działa w prosty sposób:

  1. Znajdź najmniejszy element w liście
  2. Zamień go z pierwszym elementem
  3. Powtórz dla reszty listy (bez pierwszego elementu)

Wizualizacja:

[64, 25, 12, 22, 11]
 ↓   ↓   ↓   ↓   ↓
 Szukamy minimum → 11

[11, 25, 12, 22, 64]  ← 11 na początku
     ↓   ↓   ↓   ↓
     Szukamy minimum → 12

[11, 12, 25, 22, 64]  ← 12 na 2. miejscu
         ↓   ↓   ↓
         Szukamy minimum → 22

[11, 12, 22, 25, 64]  ← 22 na 3. miejscu
             ↓   ↓
             Szukamy minimum → 25

[11, 12, 22, 25, 64]  ← POSORTOWANE!

2. Implementacja


3. Krok po kroku z wizualizacją

Wynik:

Start: [64, 25, 12, 22, 11]

Iteracja 1:
  Szukanie minimum od indeksu 0
  Minimum: arr[4] = 11
  Zamiana: arr[0] ↔ arr[4]  (64 ↔ 11)
  Po iteracji: [11, 25, 12, 22, 64]

Iteracja 2:
  Szukanie minimum od indeksu 1
  Minimum: arr[2] = 12
  Zamiana: arr[1] ↔ arr[2]  (25 ↔ 12)
  Po iteracji: [11, 12, 25, 22, 64]

...

4. Złożoność czasowa: O(n²)

Wszystkie przypadki: O(n²)!

Wzór: n(n-1)/2 = O(n²)

Najlepszy = Najgorszy = Średni = O(n²)

Nawet dla już posortowanej listy – zawsze O(n²)!


5. Złożoność pamięciowa: O(1)

Selection sort jest in-place!


6. Stabilność: NIE ❌

Selection sort nie jest stabilny – może zmienić kolejność równych elementów.

Przykład:

Dlaczego? Zamiany na długim dystansie niszczą stabilność.


7. Liczba zamian: O(n)

Kluczowa zaleta: Selection sort wykonuje maksymalnie n-1 zamian!

Porównanie: - Bubble sort: O(n²) zamian - Selection sort: O(n) zamian ← Lepsze!


8. Selection sort vs Bubble sort

Aspekt Selection Sort Bubble Sort
Złożoność czasowa O(n²) O(n²)
Złożoność pamięciowa O(1) O(1)
Stabilność ❌ NIE ✅ TAK
Liczba zamian O(n) O(n²)
Adaptywność ❌ NIE ✅ TAK (z opt)

Kiedy selection > bubble: - Gdy zamiany są kosztowne (np. duże obiekty)

Kiedy bubble > selection: - Dane prawie posortowane (z optymalizacją)


9. Wariant: Selection sort malejąco


10. Zastosowanie: K najmniejszych elementów

Złożoność: O(k × n) zamiast O(n log n) dla pełnego sortowania!


11. Benchmark

Selection i Bubble są podobnie wolne (oba O(n²)).


12. Podsumowanie

Selection Sort:

  • Złożoność czasowa: O(n²) zawsze (NIE adaptywny!)
  • Złożoność pamięciowa: O(1) in-place
  • Stabilny: NIE ❌
  • Liczba zamian: O(n) – niewiele!

Zalety: - Prosty w implementacji - In-place (O(1) pamięci) - Mało zamian O(n) – dobre dla kosztownych zamian

Wady: - O(n²) zawsze – nawet dla posortowanych - Niestabilny - Nie adaptywny

vs Bubble Sort: - Mniej zamian (O(n) vs O(n²)) - Nie adaptywny (bubble tak z optymalizacją) - Podobna wydajność ogólnie

Kiedy używać:

✅ Gdy zamiany są kosztowne (duże obiekty w pamięci) ✅ Gdy potrzebujesz k najmniejszych (zamiast pełnego sortowania) ✅ Małe dane + prostota

❌ W większości przypadków – użyj quick/merge sort!

Co dalej warto poznać:

  • Insertion Sort (lepszy dla małych/prawie posortowanych)
  • Heap Sort (podobna idea, ale O(n log n))
  • Quick Sort (praktyczny wybór)