web-dev-qa-db-ja.com

クイックソートよりもマージソートが優先される場合

多くの場合、クイックソートはマージソートよりもはるかに優れています。ただし、マージソートがクイックソートよりも優れたソリューションになる場合はいつですか?

たとえば、データを一度にメモリにロードできない場合、マージソートはクイックソートよりも優れています。他のケースはありますか?

編集:提案された重複した質問の回答は、マージソートよりもクイックソートのすべての利点をリストしています。ここでは、クイックソートを使用するよりもマージソートを使用する方が有利な場合とアプリケーションについて考えています。

すべてを一度にメモリに収めることができない場合、クイックソートとマージソートの両方がうまく機能することを言及することから始めるべきでしょう。ピボットを選択し、ディスクからメモリに要素をストリーミングし、その要素とピボットとの比較に基づいて2つの異なるファイルのいずれかに要素を書き込むことで、クイックソートを実装できます。両端優先キューを使用する場合、可能な要素の最大数を一度にメモリに収めることにより、実際にこれをさらに効率的に行うことができます。

他の人たちは、マージソートが最悪の場合O(n log n)であるという利点に言及していますが、これは間違いなく真実です。つまり、クイックソートを簡単に変更して、 introsort アルゴリズム、クイックソート、挿入ソート、およびヒープソートのハイブリッドを生成できます。ケース。

クイックソートが通常マージソートよりも高速である理由を確認すると役立つ場合があります。理由を理解すれば、マージソートが明確な勝者であるいくつかのケースをすばやく見つけることができるからです。通常、Quicksortは、次の2つの理由でmergesortよりも優れています。

  1. クイックソートは、マージソートよりも参照の局所性が優れています。つまり、クイックソートで実行されるアクセスは、通常、マージソートでの対応するアクセスよりも高速です。

  2. Quicksortは最悪の場合のO(log n)メモリ(正しく実装されている場合)を使用しますが、mergesortはマージのオーバーヘッドのためにO(n)メモリを必要とします。

ただし、これらの利点がなくなるシナリオが1つあります。要素のリンクリストをソートするとします。リンクされたリスト要素はメモリ全体に散在しているため、利点(1)はなくなります(参照の局所性はありません)。第二に、リンクリストはO(1)スペースオーバーヘッドの代わりにO(n)スペースオーバーヘッドのみ)とマージできるため、利点(2)はなくなります。 、通常、mergesortは全体の比較が少なくなり、不適切なピボット選択の影響を受けにくいため、リンクリストの並べ替えに優れたアルゴリズムであることがわかります。

お役に立てれば!

38
templatetypedef
  1. MergeSortは設計上安定しており、等しい要素は元の順序を維持します。
  2. MergeSortは、並列(マルチスレッド)の実装に適しています。
  3. MergeSortは、QuickSortよりも(約30%)少ない比較を使用します。比較は非常に高価になる可能性があるため(データベース行の複数のフィールドを比較する場合など)、これはしばしば見落とされがちな利点です。
9
martinstoeckli

クイックソートに対するマージソートの最も重要な利点の1つは、その安定性です。比較される要素は元の順序を保持します。

8
user58697

クイックソートは平均的なケースO(n log n)ですが、最悪のケースはO(n ^ 2)です。 Mergesortはalways O(n log n)です。漸近的な最悪のケースとマージソートのメモリローディング以外に、別の理由は考えられません。

クイックソートがマージソートよりも悪いシナリオ:

  1. 配列は既にソートされています。
  2. 配列内のすべての要素は同じです。
  3. 配列は逆順でソートされます。

データについて何も知らない場合は、クイックソートよりマージソートを選択してください。

5
erip

マージソートにはO(N logの上限が保証されています2N)。クイックソートにもこのような制限がありますが、はるかに高い-O(N2)。コードのタイミングに保証された上限が必要な場合は、クイックソートよりマージソートを使用します。

たとえば、並べ替えに依存するリアルタイムシステムのコードを記述する場合、マージソートの方が適しています。

3
dasblinkenlight
  1. マージソートの最悪の場合の複雑度はO(nlogn)で、クイックソートの最悪の場合はO(n ^ 2)です。
  2. マージソートは安定したソートです。つまり、配列内の同じ要素が互いに対して元の位置を維持します。
1
Shantam Mittal