クイックソートと挿入ソートを比較しています。私はqソートがほぼソートされた配列の方が遅い理由を理解しましたが、なぜインパージョンソートがすごく早いのか理解できません。ソートされた配列がソートされた配列のクイックソートより速くなる理由
答えて
いくつかの要因によって異なります。挿入ソートは、小さなデータセットのクイックソートより効率的です。また、バッキングリストの実装(LinkedListまたはArrayList)にも依存します。最後に、入力データに何らかの並べ替えがあるかどうかによっても異なります。たとえば、入力データが既に逆の順序でソートされていて、LinkedListを使用している場合、挿入ソートは高速になります。
クイックソートは、すでにソートされた配列の最悪の場合(O(n^2)時間の複雑さ)です(quicksort entry on Wikipedia参照)。
ピボット要素の選択に応じて、多少緩和することができますが、同時に、挿入ソートの最適なケースは、あらかじめソートされたケースです(このような入力にはO(n) )、この特定のユースケースではクイックソートを打ち負かすつもりです。
ソートされた配列やほぼソートされた配列の方が挿入のソートが速い理由は、配列のソートされた部分に要素を挿入するときに、要素をまったく動かす必要がないからです。たとえば、配列のソートされた部分が1 2
で、次の要素が3
の場合、3
を移動する必要がないと判断するためには、1つの比較(2 < 3
)を実行するだけです。その結果、既にソートされた配列の挿入ソートは、要素ごとに1つの比較しか行う必要がないため、線形時間です。
ソートされた入力は、挿入ソート(O(n))およびクイックソート(O(n^2))のワーストケースに最適です。
両方ともアルゴリズムの基本操作であるキー比較の回数で決まる複雑さと関連しています。
したがって、両方のアルゴリズムを見ると、挿入ソートでは、要素を挿入したときと比較してn個の比較しかないことが分かります。一方、クイックソートの場合は、ピボット要素を左要素と比較し、配列の種類を一定の係数で比較して、約n^2の比較を続けなければなりません。
- 1. ソートされた配列のクイックソート
- 2. ソートされた配列からなるソートされた配列をソート
- 3. ソートされた配列
- 4. 「ソートされた(by:)」配列が返されない/素早くPFObjectsの配列をソートする方法
- 5. ソートされた配列を未処理の配列よりも処理速度が遅くなっているのはなぜですか? (JavaのArrayList.indexOf)
- 6. ソートされた配列からソート済み多項式配列へのアルゴリズム
- 7. ソートされていないJavaのカスタマイズされたオブジェクト配列のソート
- 8. 並べ替えソート、ソートされた配列のインデックス0
- 9. ソートされた配列に番号が見つからない
- 10. 私はPerlで配列の配列をソートしたいが、結果はソートされていない。
- 11. ソート後に@@@@ Pがchar配列に追加されている理由
- 12. 配列のソートがソートされない、ソート関数の後に型が変更される
- 13. 1つの大きなソートされた配列を生成するために、2つの小さなソートされていない配列にマージ操作
- 14. 部分的にソートされたクイックソート
- 15. PHPのソート配列 - >ソート($配列[2])
- 16. Javascript配列はソートされません
- 17. 入力された配列を迅速にソートする方法は?
- 18. JavaScript内のオブジェクトのネストされた配列をソートする
- 19. Go:ソートされた配列のループ、sort.Sortが値として使用される
- 20. Mongodbネストされた配列limtとC#を使用したソート
- 21. ソートされた配列内の回転点を見つける
- 22. C++多重集合Iは、配列ソートするソートされたベクターから
- 23. ソートされた配列をユーザーに依頼するループC++
- 24. netlogoにソートされた配列をプロットする方法は?
- 25. オブジェクトをソートされた配列に変換する方法は?
- 26. ソートされた配列をJavaで印刷する
- 27. ソートされた配列に間隔を作成する
- 28. ソートされた配列perlにAを設定する
- 29. オブジェクトリテラルをソートされた配列に変換する
- 30. オブジェクトをソートされた配列に変換する方法
挿入の並べ替えの詳細を提供します。配列がソートされたら、反復処理を停止するチェックがありますか? –