したがって、基本的には、次のような比較関数が与えられた場合に、平均的なケースから低下しないソートアルゴリズムがあるかどうかを知りたいと思います。
int Compare(object a, object b) { return Random.Next(-1,1); }
...ここでRandom.Next()は、指定された下限と上限の間にランダムに生成された整数を生成するメソッドです。
答えは、実際には、ほとんどの基本的なソートアルゴリズムが平均的なケースに従って実行されるということです。なぜなら、以下の2つの条件の少なくとも1つに従うからです。
- 2つの一意の要素間の比較がソートで2回行われることはありません。
- ソートの各反復で、少なくとも1つの要素の正しい位置が決定されるため、その要素は二度と比較されません。
たとえば、SelectionSortは、並べ替えられていない要素のサブリストを反復処理し、「最小」および/または「最大」要素を見つけて(各要素をこれまでの最大要素と比較することにより)、正しい位置に配置して繰り返します。その結果、非決定的なコンパレータを使用しても、アルゴリズムはすべての反復の終わりに、最小または最大と考えられる値を見つけ、それを決定しようとしている位置の要素と交換し、考慮しませんただし、このプロセス中にAとBを複数回比較できます(最も極端な例として、逆の順序で並べ替えられた配列でSelectionSortのいくつかのパスを検討します)。したがって、条件1に違反します。 。
MergeSortは2ではなく条件1に従います。サブ配列がマージされると、同じサブ配列(左側または右側)の要素は互いに比較されません。これは、配列のその側の要素が相互に整然と並んでいると既に判断されているためです。アルゴリズムは、各サブアレイの最もマージされていない要素を他と比較するだけで、どちらがより小さく、マージされたリストで次に進むべきかを決定します。つまり、2つの一意のオブジェクトAとBが最大1回互いに比較されますが、完全なコレクション内の特定の要素の「最終」インデックスは、アルゴリズムが完了するまでわかりません。
InsertionSortは、全体的な戦略と複雑さがSelectionSortに似ている場合でも、条件1のみに従います。並べ替えられていない各要素は、検査対象の要素よりも小さい要素が見つかるまで、最も大きいものから順に並べ替えられた要素と比較されます。その時点で要素が挿入され、次の要素が考慮されます。その結果、AとBの相対的な順序は1つの比較によって決定され、そのAとBの間のさらなる比較は実行されませんが、すべての要素が考慮されるまで、要素の最終位置はわかりません。
QuickSortは両方に従います条件。各レベルで、ピボットが選択され、「左側」にピボットよりも小さい要素が含まれ、「右側」にピボットよりも大きい要素が含まれるように配置されます。そのレベルの結果は、QuickSort(左)+ピボット+ QuickSort(右)です。これは、基本的にピボット要素の位置がわかっていることを意味します(左側の長さよりも1つのインデックスが大きい)。ピボットとして選択された後(以前のピボット要素と比較された可能性がありますが、これらの要素も既知であり、サブアレイに含まれていません)、およびピボットの反対側にあるAおよびBは決してありません比較しました。純粋なQuickSortのほとんどの実装では、基本ケースは1つの要素であり、その時点で現在のインデックスは最終インデックスであり、それ以上の比較は行われません。
(2 / 3 )N− 1)。コンパレーターの結果の最大絶対値が増加すると、いずれかの比較が負またはゼロを返す確率が0.5に向かって減少し、アルゴリズムを終了する可能性がはるかに低くなります(99コインの可能性がすべての着陸ヘッドを反転します) 、これは基本的にこれが要約するものであり、1.2 * 10 30分の 1です)
長時間の編集:ランダムコンパレータを組み込んだ、禁止事項の例として特別に設計された「ソート」がいくつかあります。おそらく最も有名なのはBogoSortです。「リストが与えられた場合、リストの順序が正しくない場合は、リストをシャッフルしてもう一度確認してください」。理論的には、上記の「最適化されていないBubbleSort」と同様に、最終的に値の正しい順列にヒットしますが、平均ケースは階乗時間(N!/ 2)であり、誕生日の問題のため(十分なランダム順列の後、ユニークなものよりも重複する順列に遭遇する可能性が高くなります)アルゴリズムが時間的に制限されていないため、アルゴリズムが公式に完了しない可能性はゼロではありません。