algorithm
Sortuj wybór
Szukaj…
Wybór Sortuj Podstawowe informacje
Sortowanie selekcji jest algorytmem sortowania, w szczególności sortowaniem porównawczym na miejscu. Ma złożoność czasową O (n2), co czyni go nieefektywnym na dużych listach i ogólnie działa gorzej niż podobny rodzaj wstawiania. Sortowanie wyboru jest znane z jego prostoty i ma przewagę wydajności nad bardziej skomplikowanymi algorytmami w niektórych sytuacjach, szczególnie tam, gdzie pamięć pomocnicza jest ograniczona.
Algorytm dzieli listę danych wejściowych na dwie części: podlistę pozycji już posortowanych, która jest tworzona od lewej do prawej z przodu (z lewej) listy, oraz podlistę elementów do posortowania, które zajmują resztę lista. Początkowo posortowana podlista jest pusta, a nieposortowana podlista to cała lista wejściowa. Algorytm przebiega przez znalezienie najmniejszego (lub największego, w zależności od kolejności sortowania) elementu w nieposortowanej podlistie, zamianie (zamianie) go na skrajnie lewy nieposortowany element (umieszczenie go w uporządkowanej kolejności) i przesunięcie granic podlisty o jeden element w prawo .
Pseudo kod sortowania według wyboru:
function select(list[1..n], k)
for i from 1 to k
minIndex = i
minValue = list[i]
for j from i+1 to n
if list[j] < minValue
minIndex = j
minValue = list[j]
swap list[i] and list[minIndex]
return list[k]
Wizualizacja wyboru sortowania:
Przykład sortowania według wyboru:
Przestrzeń pomocnicza: O(n)
Złożoność czasu: O(n^2)
Implementacja sortowania selekcji w C #
Użyłem języka C # do implementacji algorytmu sortowania selekcji.
public class SelectionSort
{
private static void SortSelection(int[] input, int n)
{
for (int i = 0; i < n - 1; i++)
{
var minId = i;
int j;
for (j = i + 1; j < n; j++)
{
if (input[j] < input[minId]) minId = j;
}
var temp = input[minId];
input[minId] = input[i];
input[i] = temp;
}
}
public static int[] Main(int[] input)
{
SortSelection(input, input.Length);
return input;
}
}
Wdrożenie eliksiru
defmodule Selection do
def sort(list) when is_list(list) do
do_selection(list, [])
end
def do_selection([head|[]], acc) do
acc ++ [head]
end
def do_selection(list, acc) do
min = min(list)
do_selection(:lists.delete(min, list), acc ++ [min])
end
defp min([first|[second|[]]]) do
smaller(first, second)
end
defp min([first|[second|tail]]) do
min([smaller(first, second)|tail])
end
defp smaller(e1, e2) do
if e1 <= e2 do
e1
else
e2
end
end
end
Selection.sort([100,4,10,6,9,3])
|> IO.inspect