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:

Wybór sortowania Animacja

Przykład sortowania według wyboru:

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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow