C#でデータを並べ替えるのに最適なアルゴリズムは何ですか?
並べ替えの80%を適切に処理できる1つの並べ替えアルゴリズムはありますか?
該当する場合は、コード例を示してください。
このサイトをチェックしてください: アニメーションとの比較のソート
短い答え:クイックソート
より長い回答:上記のサイトでは、各アルゴリズムの長所と短所をいくつかの気の利いたアニメーションで示しています。
簡単に言えば、すべての並べ替えには最善の方法はありません(しかし、80%の確率で言ったので、それを知っていました:))が、クイックソート(または3ウェイクイックソート)は、おそらく最も優れた一般的なアルゴリズムです。
これは.Netのリストにデフォルトで使用されるアルゴリズムなので、すでに持っているものがリストにある場合は、.Sort
を呼び出すだけです。
これを実装する方法を確認したい場合は、上記で指摘したWebサイトに疑似コードがあります。
何を分類しようとしていますか?使用しない理由はありますか?
List<T>.Sort() ?
これはQuickSortを使用していると思います。コーディングエラーを心配する必要はありません。 IComparableを実装して、並べ替える対象を変更できます。
すべてのデータがメモリに収まらない場合は、Mergeソートまたはそれらのラインに沿った何かを使用してレースに参加できます。
バブルソートと挿入ソートは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://www.codeproject.com/KB/recipes/QuickSort_gen.aspx