なぜJava
と_.NET Framework
_がデフォルトで異なるソートアルゴリズムを使用するのか疑問に思います。
Javaの場合Array.Sort()
は、デフォルトで Merge Sort アルゴリズムを使用します Wikipedia.com 言う:
Javaでは、Arrays.sort()メソッドは、データ型に応じてマージソートまたは調整されたクイックソートを使用し、実装効率を上げるために、ソートされる配列要素が7つ未満の場合は挿入ソートに切り替えます。
。NET FrameworkArray.Sort/List.Sort()
は、デフォルトのソートアルゴリズムとして Quick Sort を使用します( [〜 #〜] msdn [〜#〜] ):
List.Sort()は、QuickSortアルゴリズムを使用するArray.Sortを使用します。この実装は不安定なソートを実行します。つまり、2つの要素が等しい場合、それらの順序は保持されない可能性があります。対照的に、安定したソートでは、等しい要素の順序が保持されます。
素晴らしい "アルゴリズムの比較" テーブルを見ると、両方のアルゴリズムの動作がワーストケースとメモリ使用率の観点からかなり異なっていることがわかります。
Java
と_.NET
_はどちらもエンタープライズソリューション開発に最適なフレームワークであり、どちらも組み込み開発用のプラットフォームを備えています。では、なぜデフォルトで別のソートアルゴリズムを使用しているのでしょうか。
コンピュータ自体がそうであるように決定論的であるように、コンピュータ工学は正確な科学ではありません。同じ問題領域が与えられた2人が分析を実行し、問題のすべての制約を満たす2つの異なるソリューションを開発します。これらのどれが一般的な場合に「より良い」かを経験的に決定することは困難または不可能かもしれません。
私の推測では、.NET QuickSortはMFCまたはWindows APIの何かの上に階層化されており、MergeSortのマルチスレッド対応の利点がコンピューターでさえ考慮されていなかったはるか古いバージョンのWindowsから継承されていると思いますその日。 (編集:そうではありませんが、Microsoftの開発者は、長い間QuickSortのファンでしたが、MS-DOS以降のソートの実装のこの選択によって証明されています)。
Javaは完全にプラットフォームに依存しないようにゼロから設計されたため、プラットフォーム固有の実装を使用できないJavaは別の方法で実行されました。MergeSortがトップに出た理由を知っている人、私のワイルド実装は、開発者が思いついた他の種類のパフォーマンスと比較して、ある種のパフォーマンス競争に勝った、またはO(n)スペースのMergeSortが、最良のケースと最悪のケースのパフォーマンス(MergeSort QuickSortのような要素の選択に関連するAchillesのかかとはなく、その最良のケースは、ソート順の近いリストですが、QuickSortの最悪の場合がよくあります。マルチスレッドの利点が最初に検討されたのではないかと思いますが、現在の実装はマルチスレッドの可能性があります。
2つの異なる会社の異なる開発チームは、フレームワークとコンポーネントの通常の使用例に関して異なる結論に達し、それに応じて実装することを決定しました。
基本的に、各企業は分析を行い、クライアントベースを検討し、それに応じて異なる決定を行いました。
異なる仮定や生データを使用して同じ結論に至るまで、異なる会社やチームによる分析を期待することはできません。
Javaが Timsort を使用するようになったため、この質問は少し時代遅れです。Java 7現在)
言及された特定のアルゴリズムのうち:
QuicksortはO(n ^ 2)で最悪のパフォーマンスを発揮しますが、やや軽量/メモリ消費が少ないため、一般的なケースでパフォーマンスが向上します。
MergesortはO(n log n)での最悪の場合のパフォーマンスを保証していますが、オーバーヘッドとメモリ要件が少し多くなります。また、自動的に安定します(つまり、同じ要素を同じ順序で維持します)。
Java設計者は一般に少し保守的であるように見えます/「正しいこと」に焦点を当てているので、より優れた保証を提供するため、2つからMergesortを選択したことは当然のことです。
マイクロソフトがクイックソートを選択した理由がわからない、おそらくそれはいくつかのマイクロベンチマークで見栄えをよくするだろうが?