DAA - Sortowanie przez wybór

Ten typ sortowania nosi nazwę Selection Sortjak to działa poprzez wielokrotne sortowanie elementów. Działa to w następujący sposób: najpierw znajdź najmniejszy w tablicy i zamień go z elementem na pierwszej pozycji, następnie znajdź drugi najmniejszy element i zamień go z elementem na drugiej pozycji i kontynuuj w ten sposób aż cała tablica będzie posortowane.

Algorithm: Selection-Sort (A) 
fori ← 1 to n-1 do 
   min j ← i; 
   min x ← A[i] 
   for j ←i + 1 to n do 
      if A[j] < min x then 
         min j ← j 
         min x ← A[j] 
   A[min j] ← A [i] 
   A[i] ← min x

Sortowanie przez wybieranie należy do najprostszych technik sortowania i działa bardzo dobrze w przypadku małych plików. Ma dość ważne zastosowanie, ponieważ każdy element jest przenoszony najwyżej raz.

Sortowanie sekcji jest metodą z wyboru do sortowania plików z bardzo dużymi obiektami (rekordami) i małymi kluczami. Najgorszy przypadek ma miejsce, gdy tablica jest już posortowana w porządku malejącym i chcemy posortować je w kolejności rosnącej.

Niemniej jednak czas wymagany przez algorytm sortowania przez wybór nie jest bardzo wrażliwy na pierwotną kolejność sortowanej tablicy: test, jeśli A[j] < min x jest wykonywany dokładnie tyle samo razy w każdym przypadku.

Sortowanie przez wybór spędza większość czasu na próbach znalezienia minimalnego elementu w nieposortowanej części tablicy. Wyraźnie pokazuje podobieństwo między sortowaniem przez wybór i sortowaniem bąbelkowym.

  • Sortowanie bąbelkowe wybiera maksymalną liczbę pozostałych elementów na każdym etapie, ale marnuje trochę wysiłku, nadając porządek nieposortowanej części tablicy.

  • Sortowanie przez wybór jest kwadratowe zarówno w najgorszym, jak i przeciętnym przypadku, i nie wymaga dodatkowej pamięci.

Dla każdego i z 1 do n - 1, jest jedna wymiana i n - i porównań, więc jest w sumie n - 1 wymiany i

(n − 1) + (n − 2) + ...+ 2 + 1 = n(n − 1)/2 porównania.

Te obserwacje są prawdziwe, bez względu na dane wejściowe.

W najgorszym przypadku może to być kwadrat, ale w przeciętnym przypadku jest to wielkość O(n log n). Oznacza to, żerunning time of Selection sort is quite insensitive to the input.

Realizacja

Void Selection-Sort(int numbers[], int array_size) { 
   int i, j; 
   int min, temp;  
   for (i = 0; I < array_size-1; i++) { 
      min = i; 
      for (j = i+1; j < array_size; j++) 
         if (numbers[j] < numbers[min]) 
            min = j; 
      temp = numbers[i]; 
      numbers[i] = numbers[min]; 
      numbers[min] = temp; 
   } 
}

Przykład

Unsorted list:

5 2 1 4 3

1 st iteracja:

Najmniejszy = 5

2 <5, najmniejsza = 2

1 <2, najmniejszy = 1

4> 1, najmniejsza = 1

3> 1, najmniejsza = 1

Zamień 5 i 1

1 2 5 4 3

2 ND iteracji:

Najmniejszy = 2

2 <5, najmniejsza = 2

2 <4, najmniejsza = 2

2 <3, najmniejsza = 2

Brak zamiany

1 2 5 4 3

3 rd iteracji:

Najmniejszy = 5

4 <5, najmniejsza = 4

3 <4, najmniejsza = 3

Zamień 5 i 3

1 2 3 4 5

4 p iteracji:

Najmniejszy = 4

4 <5, najmniejsza = 4

Brak zamiany

1 2 3 4 5

Wreszcie,

the sorted list is

1 2 3 4 5