Recherche…


Sélection Tri Informations de base

Le tri par sélection est un algorithme de tri, en particulier un tri de comparaison sur place. Il a une complexité temporelle de O (n2), ce qui le rend inefficace sur les grandes listes, et donne généralement de meilleurs résultats que le tri par insertion similaire. Le tri par sélection est connu pour sa simplicité et présente des avantages en termes de performances par rapport à des algorithmes plus compliqués dans certaines situations, en particulier lorsque la mémoire auxiliaire est limitée.

L'algorithme divise la liste d'entrée en deux parties: la sous-liste des éléments déjà triés, qui est construite de gauche à droite au début (gauche) de la liste, et la sous-liste des éléments restant à trier qui occupent le reste de la liste. liste. Initialement, la sous-liste triée est vide et la sous-liste non triée est la liste complète des entrées. L'algorithme procède en trouvant l'élément le plus petit (ou le plus grand, selon l'ordre de tri) dans la sous-liste non triée, en échangeant (échangeant) l'élément non trié le plus à gauche (en le triant) et en déplaçant les limites .

Pseudo-code pour le tri de sélection:

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]

Visualisation du tri de sélection:

Tri de sélection Animation

Exemple de tri de sélection:

Exemple de tri de sélection

Espace auxiliaire: O(n)
Complexité temporelle: O(n^2)

Implémentation du tri par sélection en C #

J'ai utilisé le langage C # pour implémenter un algorithme de tri de sélection.

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;
    }
}

Mise en œuvre de l'élixir

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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow