web-dev-qa-db-ja.com

要素のリストが小さい場合、挿入ソートはクイックソートよりも優れているのはなぜですか?

挿入ソートO(n ^ 2)>クイックソートO(nlogn)ではありませんか?小さいnの場合、関係は同じですか?

27
user1031752

Big-O表記は、nが大きい場合の制限動作を示します。漸近動作とも呼ばれます。これは概算です。 ( http://en.wikipedia.org/wiki/Big_O_notation を参照)

クイックソートには再帰的な関数呼び出しによる余分なオーバーヘッドがあるため、挿入nは小さいnの方が高速です。挿入ソートは、クイックソートよりも安定しており、必要なメモリも少なくなります。

この質問では、挿入ソートのいくつかのさらなる利点について説明します。 ( 挿入ソートを使用する十分な理由はありますか?

20
Casey Robinson

「小さい」を定義します。

ソートアルゴリズムのベンチマークを行っているとき、クイックソートから挿入ソートへの切り替えは、誰もが言っていることにもかかわらず、実際には4要素を超える配列のパフォーマンス(Cの再帰的クイックソート)に悪影響を与えることがわかりました。また、これらの配列は、サイズに依存する最適なソートアルゴリズムでソートできます。

そうは言っても、常にO(n...)は比較の数であり(この特定の場合)、アルゴリズムの速度ではないことに注意してください。速度は実装に依存します。 g。、クイックソートが再帰的であるかどうか、および関数呼び出しがどれだけ迅速に処理されるか。

最後に重要なことですが、ビッグオー表記法は上限にすぎません。

アルゴリズムAが_10000 n log n_比較を必要とし、アルゴリズムBが_10 n ^ 2_を必要とする場合、1つ目はO(n log n)で、2つ目はO(n ^ 2)です。それにもかかわらず、2番目は(おそらく)高速になります。

10
Dennis

O()表記は、通常、大規模な問題のパフォーマンスを特徴付けるために使用されますが、パフォーマンスに対する定数係数と追加のオフセットは意図的に無視されます。

定数要素とオーバーヘッドはプロセッサ間および実装間で大きく異なる可能性があるため、これは重要です。6502マシンでシングルスレッドの基本プログラムで得られるパフォーマンスは、Intel i7で実行されるCプログラムとして実装された同じアルゴリズムとは大きく異なりますクラスのプロセッサ。実装の最適化も要因であることに注意してください。詳細に注意することで、他のすべての要因が同じであっても、多くの場合、パフォーマンスが大幅に向上します。

ただし、定数係数とオーバーヘッドは依然として重要です。アプリケーションでNが決して大きくならないことが保証されている場合、O(N ^ 2)対O(N log N)の漸近的な動作は機能しません。

挿入ソートは単純であり、小さなリストの場合、一般的に、同等に実装されたクイックソートまたはマージソートよりも高速です。そのため、実用的な並べ替えの実装では、通常、「基本ケース」の挿入並べ替えなどに頼るのではなく、単一の要素までさかのぼって再帰します。

4
comingstorm

これは、big-oh表記で無視する実行時間に関連付けられている定数の問題です(成長の順序に関係しているため)。挿入ソートの場合、実行時間はO(n ^ 2)、つまりT(n)<= c(n ^ 2)ですが、クイックソートの場合はT(n)<= k(nlgn)です。 cは非常に小さいため、小さいnの場合、挿入ソートの実行時間はクイックソートの実行時間よりも短くなります。

それが役に立てば幸い...

3
bhuwansahni

挿入ソートをクイックソートと組み合わせて使用​​できる実例は、qsortからのglibc関数の実装です。

最初に指摘することは、qsortはスタックを使用してクイックソートアルゴリズムを実装することです。これは、メモリ消費量が少ないため、マクロディレクティブによってスタックが実装されます。

ソースコード からの現在の実装の概要(これを見てみると、コメントを通じて多くの有用な情報を見つけることができます):

  1. 非再帰的

  2. 3つの中央値の決定木を使用してピボット要素を選択しました

  3. TOTAL_ELEMS/MAX_THRESHパーティションのみをクイックソートし、各パーティション内のMAX_THRESHアイテムを並べ替える挿入ソートを残します。 これは大きな勝利です。挿入ソートは、小さな、主にソートされた配列セグメントの方が高速であるためです。

  4. 2つのサブパーティションのうち大きい方が常に最初にスタックにプッシュされます。

MAX_THRESH値の意味は何ですか?まあ、それは小さな一定の魔法の値

sun 4/260で最適に動作するように選択されました。

0
FUNNYDMAN

バイナリ挿入ソートはどうですか?バイナリサーチを使用して、スワップする位置を絶対的に検索できます。

0
nhp