ソートアルゴリズムの比較
ソートアルゴリズムは、データ管理の重要な部分です。 AtCprogramming.com、私たちは、最も重要なを理解するためのチュートリアルを提供し、一般的な技術を分類します。 各アルゴリズムには特定の強みがあり、多くの場合、組み込み関数qsortを使用することが最善の方法です。 これがオプションではない場合や、迅速で汚れたソートアルゴリズムが必要な場合は、さまざまな選択肢があります。
ほとんどのソートアルゴリズムは、ソートされているデータを比較することによって動作します。 いくつかのケースでは、そのデータの一部のみに基づいて、大きなデータの塊(例えば、名前とアドレスを含むastruct)をソートすることが望ましい場合があります。ソートされた順序を決定するために実際に使用されるデータの部分は、キーと呼ばれます。
ソートアルゴリズムは、通常、その効率によって判断されます。 この場合、効率とは、入力のサイズが大きくなるにつれてアルゴリズム的効率を指し、一般的にソートする要素の数に基づいています。 使用されているアルゴリズムのほとんどは、o(n^2)またはO(n*log(n))のいずれかのアルゴリズム効率を持っています。 いくつかの特殊なケースアルゴリズム(プログラミング真珠で言及されている一例)は、O(n*log(n))よりも高速に特定のデータセットをソートできます。 これらのアルゴリズムは、ソートされている項目の比較に基づいておらず、ontricksに依存しています。 キー比較アルゴリズムはO(n*log(n))よりも優れていることが示されています。
同じ効率を持つ多くのアルゴリズムは、同じ入力で同じ速度を持っていません。 まず、アルゴリズムは、その平均ケース、最良ケース、および最悪ケースの効率に基づいて判断する必要があります。 クイックソートのようないくつかのアルゴリズムは、いくつかの入力に対して非常にうまく機能しますが、他の入力では恐ろしく機能します。 Merge sortなどの他のアルゴリズムは、入力データの順序に影響されません。バブルソートの修正版でさえ、最も好ましい入力に対してO(n)で終了することができます。
第二の要因は、”定数項”です。 Big-O記法はプロセスの詳細の多くを抽象化するので、bigpictureを見るのに非常に便利です。 しかし、脱落することの1つは、式の前の定数です:たとえば、O(c*n)は単なるO(n)です。 現実の世界では、定数cは異なるアルゴリズムによって異なります。 適切に実装されたquicksortは、ヒープソートよりもはるかに小さい定数乗数を持つ必要があります。
アルゴリズムを判断するための第二の基準は、そのスペース要件です-dotheyはスクラッチスペースを必要とするか、配列を所定の位置にソートすることがで いくつかのアルゴリズムはextraスペースを必要としませんが、extraスペースで実装すると最も簡単に理解できるものもあります(例えば、ヒープソートは所定の場所で行うことができますが、概念的には別のヒープを考える方がはるかに簡単です)。 スペース要件は、使用されるデータ構造に依存する場合があります(たとえば、配列のマージソートとリンクされたリストのマージソート)。
第三の基準は安定性です-ソートはキーの順序を保持しますか等しい値を持ちますか? ほとんどの単純なソートはこれを行いますが、heap sortなどのいくつかのソートは行いません。
次のグラフは、上記のさまざまな基準でソートアルゴリズムを比較しています; より高い定数項を持つアルゴリズムが最初に表示されますが、これは明らかに実装依存の概念であり、同じbig-O効率の種類を選ぶときにのみ大まかな
Time | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Sort | Average | Best | Worst | Space | Stability | Remarks | ||||||||||||||
Bubble sort | O(n^2) | O(n^2) | O(n^2) | Constant | Stable | Always use a modified bubble sort | ||||||||||||||
Modified Bubble sort | O(n^2) | O(n) | O(n^2) | Constant | Stable | Stops after reaching a sorted array | ||||||||||||||
Selection Sort | O(n^2) | O(n^2) | O(n^2) | 定数 | 安定 | 完全にソートされた入力でも、配列全体をスキャンする必要があります | ||||||||||||||
挿入ソート | O(n^2) | O(n) | O(n^2) | O(N^2) | O(N^2) | 定数 | 安定 | 安定 | 安定 | 安定 | 安定 | 安定 | 安定 | 安定 | 安定 | 安定 | 安定 | 安定 | 安定td> | 最良のケース(すでにソートされている)では、すべての挿入は一定の時間を必要とします |
ヒープソート | o(n*log(n)) | o(n*log(n)) | o(N*Log(n)) | o(N*Log(n)) | constant | instable | 入力配列をヒープのストレージとして使用することにより、一定のスペースを達成することができます | td> | ||||||||||||
マージソート | O(n*log(n)) | O(n*log(n)) | 依存しています | 安定しています | 配列ではマージソートにはo(n)スペースが必要です。td>o(n*log(n)) | o(n^2) | constant | stable | ピボット値をランダムに選択する(またはソートする前に配列をシャッフルする)ことは、完全にソートされた配列などの最悪 |