web-dev-qa-db-fra.com

Meilleurs algorithmes de tri pour C # / .NET dans différents scénarios

Quels sont les meilleurs algorithmes pour trier les données en C #?

Existe-t-il un algorithme de tri capable de bien gérer 80% des tris?

Veuillez donner des exemples de code, le cas échéant.

35
Dan Esparza

Consultez ce site: Tri des comparaisons avec les animations

Réponse courte: Tri rapide

Réponse plus longue: le site ci-dessus vous montrera les forces et les faiblesses de chaque algorithme avec quelques animations astucieuses.

La réponse courte est qu'il n'y a pas de meilleur tri complet (mais vous le saviez puisque vous avez dit 80% du temps :)), mais le tri rapide (ou tri rapide à 3 voies) sera probablement le meilleur algorithme général que vous pourriez utiliser.

Il s'agit de l'algorithme utilisé par défaut pour les listes en .Net, vous pouvez donc simplement appeler .Sort si ce que vous avez est déjà dans une liste.

Il y a un pseudo-code sur le site Web que je vous ai indiqué ci-dessus si vous voulez voir comment l'implémenter.

45
CubanX

Qu'essayez-vous de trier? Y a-t-il une raison de ne pas utiliser:

List<T>.Sort() ? 

Je suis sûr que cela utilise QuickSort et vous n'avez pas à vous soucier de faire des erreurs de codage. Vous pouvez implémenter IComparable pour modifier ce que vous souhaitez trier.

Si toutes vos données ne tiennent pas en mémoire ... eh bien, vous êtes parti pour les courses avec le tri par fusion ou quelque chose du genre.

9
Keltex

Le Bubblesort et le Insertionsort sont O (n ^ 2), le Mergesort et le Quicksort sont O (nlogn). Vous pouvez utiliser la méthode Sort () de List, qui implémente Quicksort, ou vous pouvez également l'implémenter et l'adapter à vos besoins. Voici une implémentation de base: Quicksort

//O(nlogn) 
public static void QuickSort(int[] array, int init, int end)
{
   if (init < end)
   {
       int pivot = Partition(array, init, end);
       QuickSort(array, init, pivot-1);
       QuickSort(array, pivot + 1, end);
   }   
}

//O(n)
private static int Partition(int[] array, int init, int end)
{
   int last = array[end];
   int i = init - 1;
   for (int j = init; j < end; j++)
   {
        if (array[j] <= last)
        {
            i++;
            Exchange(array, i, j);     
         }
    }
    Exchange(array, i + 1, end);
    return i + 1;
}

private static void Exchange(int[] array, int i, int j)
{
    int temp = array[i];
    array[i] = array[j];
    array[j] = temp;
}

De http://yadiragarnicabonome.com/sorting-arrays/

2
0
Manu