マージソートとクイックソートの両方について、私はそれらが最悪になるシナリオを考え出しています。私が正しければ、すべてがソートされるとソートの最悪のケースO(nlogn)をマージします。クイックソートの最悪のケースは、ピボットが最も最適でない場所にあり、配列がソートされているので、O(n^2)になります。私はこれが最初に正しいかどうか疑問に思っていたので、そうでなければ私を修正してください。 私の実際の質問は、クイックソートのピボットが配列の途中にある場合、配列はO(n^2)になるためにどのように見えますか?マージソートとクイックソートの実行時間の理解
2
A
答えて
1
クイックソートの最悪のケースは、ピボットがソートされる残りの値のすべてより小さいか大きい場合です。この場合、再帰の各レベルで残りの値から1つのアイテムだけが削除され、時間の複雑さはO(n^2)になります。
基本的なマージソートの場合、トップダウンまたはボトムアップの場合、移動回数は常に同じです。比較の数はデータパターンに依存します。サイズnの2回のランをマージすると、最悪の場合の比較数は2n-1です(2つのランから1つを除いた各要素が比較され、要素が1つだけ残っている場合は比較対象がないのでコピーされます)最善のケースは、ある実行の要素のすべてがもう1つの実行の最初の要素よりも小さい場合です。その場合、データのソートまたは逆ソートの場合など、比較の回数はn回です。
0
クイックソートをエミュレートすることができます。ピボットを選択するたびに、最悪の場合のパフォーマンスを保証するために0,1,2、...が連続していることを確認してください。
これは、配列を所定の位置に分割する前にピボット値を配列の先頭にスワップする通常のピボットアルゴリズムを前提としています。この場合、ピボットをピックして最小の残りのアイテムにするので、分割する必要はありません。
class Cell:
def set(self, v):
self.v = v
def worst_case_quicksort(xs, i):
xs = xs[:]
for i in xrange(len(xs)):
p = (len(xs) - i) // 2
xs[i+p].set(i)
xs[i], xs[i+p] = xs[i+p], xs[i]
xs = [Cell() for _ in xrange(20)]
worst_case_quicksort(xs, 0)
print [x.v for x in xs]
出力は次のようになります:
[1, 11, 3, 19, 5, 13, 7, 17, 9, 15, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
関連する問題
- 1. タイムスライスと実行時間の理解
- 2. クイックソートと挿入ソートハイブリッドの予想実行時間
- 3. クイックソートの最悪の実行時間を証明する
- 4. 修正後のクイックソートの実行時間= O(Nk)
- 5. マージソートの実行時間::すべての要素が同じです
- 6. マージソートの空間複雑度解析(C++)
- 7. 理論ソルバーの実行時間をトリガー
- 8. マージソートアルゴリズムのベスト実行時間と平均実行時間
- 9. ViewModelの管理に関する質問(DesignTimeと実行時間)
- 10. タイプとnewtypeのコンパイル時間と実行時間の差
- 11. クイックソートの実装
- 12. Rパッケージと実行時間
- 13. Ruby on Railsのレンダリング時間の理解
- 14. このPython関数の実行時の理解について
- 15. Clojureの同時実行の例を理解する
- 16. numpy配列で実行時間を理解していますか?
- 17. 「コンパイル時間」と「実行時間」の違いは何ですか?
- 18. C#コードサイズとコードの実行時間
- 19. AngularとJQueryの実行時間
- 20. アルゴリズムの複雑さと実行時間
- 21. mySqlプロシージャの実行に実行時間のパターンがある理由
- 22. クイックソートの実装にMergesortよりも時間がかかるようです
- 23. SSISの実行時間
- 24. 実行時間の比較
- 25. アルゴリズムのC++実行時間
- 26. Ocamlの実行時間
- 27. javaアップデートプロパティファイルの実行時間
- 28. ソートアルゴリズムの実行時間
- 29. 実行時間のテキストボックス
- 30. Clojureプログラムの実行時間
ピボットの配列[5だったので、場合1,2,3,4,5,6ここ
はエミュレーションコードです、7,8,9]は中間にあるので、実行時間はO(n log n)になるでしょう。なぜなら、5は配列の他の値よりも大きくても小さくないからですか?また、ピボットがまだ5で、配列が[7,8,9,10,5,11,12,13,14]のようなものであれば、ピボットは他の値よりも小さいので、これはO(n^2)時間の複雑さの例? – Dinoman979@ Dinoman979 - はい、しかし、O(n^2)時間の複雑さでは、コードは、中間のピボットが残りの値よりも小さいかまたは大きい状況に繰り返し遭遇する必要があります。コードが中間値を選択した場合、パターンは複雑になり、ピボットが再帰呼び出しによって渡されたサブ配列に含まれているかどうかに依存します。 – rcgldr