web-dev-qa-db-ja.com

さまざまなシナリオでのC#/ .NETに最適な並べ替えアルゴリズム

C#でデータを並べ替えるのに最適なアルゴリズムは何ですか?

並べ替えの80%を適切に処理できる1つの並べ替えアルゴリズムはありますか?

該当する場合は、コード例を示してください。

35
Dan Esparza

このサイトをチェックしてください: アニメーションとの比較のソート

短い答え:クイックソート

より長い回答:上記のサイトでは、各アルゴリズムの長所と短所をいくつかの気の利いたアニメーションで示しています。

簡単に言えば、すべての並べ替えには最善の方法はありません(しかし、80%の確率で言ったので、それを知っていました:))が、クイックソート(または3ウェイクイックソート)は、おそらく最も優れた一般的なアルゴリズムです。

これは.Netのリストにデフォルトで使用されるアルゴリズムなので、すでに持っているものがリストにある場合は、.Sortを呼び出すだけです。

これを実装する方法を確認したい場合は、上記で指摘したWebサイトに疑似コードがあります。

45
CubanX

何を分類しようとしていますか?使用しない理由はありますか?

List<T>.Sort() ? 

これはQuickSortを使用していると思います。コーディングエラーを心配する必要はありません。 IComparableを実装して、並べ替える対象を変更できます。

すべてのデータがメモリに収まらない場合は、Mergeソートまたはそれらのラインに沿った何かを使用してレースに参加できます。

9
Keltex

バブルソートと挿入ソートはO(n ^ 2)、マージソートとクイックソートはO(nlogn)です。 Quicksortを実装するListのSort()メソッドを使用することも、実装して自分のニーズに適合させることもできます。基本的な実装は次のとおりです。

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

から http://yadiragarnicabonome.com/sorting-arrays/

クイックソートを試してください: http://www.codeproject.com/KB/recipes/QuickSort_gen.aspx

0
Manu