web-dev-qa-db-ja.com

3ウェイパーティションを備えたクイックソート

3ウェイパーティションを備えたQuickSortとは何ですか?

35
CodeMonkey1313

配列を描く:

3, 5, 2, 7, 6, 4, 2, 8, 8, 9, 0

A 2つのパーティションのクイックソートは、4などの値を選択し、4より大きいすべての要素を配列の片側に配置し、4未満のすべての要素を反対側に配置します。そのようです:

3, 2, 0, 2, 4, | 8, 7, 8, 9, 6, 5

つのパーティションのクイックソートは、2つの値を選択してパーティション分割し、その方法で配列を分割します。 4と7を選択しましょう:

3, 2, 0, 2, | 4, 6, 5, 7, | 8, 8, 9

通常のクイックソートのわずかなバリエーションです。

配列がソートされるまで、各パーティションのパーティション分割を続けます。ランタイムは技術的にはnlogです(n)通常のクイックソートのnlogとは少しずつ異なります2(n)。

52
jjnguy
16
cgp

3ウェイパーティションはDjstrkaによるものだと思います。

要素が{ 3, 9, 4, 1, 2, 3, 15, 17, 25, 17 }の配列について考えてみましょう。

基本的には、3つのパーティションを設定します。特定のピボットより小さい、等しい、より大きいです。 equal-toパーティションは、すべての要素がすでに等しいため、さらにソートする必要はありません。


たとえば、最初の3をピボットとして選択した場合、Dijkstraを使用する3ウェイパーティションは元の配列を配置し、2つのインデックスm1m2を返し、インデックスがm1より小さいすべての要素が3より低くなるように、すべてインデックスがm1以上でm2以下の要素は3と等しくなり、インデックスがm2より大きいすべての要素は3より大きくなります。

この特定のケースでは、結果の配列は{ 1, 2, 3, 3, 9, 4, 15, 17, 25, 17 }になり、値m1およびm2m1 = 2およびm2 = 3になります。

結果の配列は、パーティション化に使用される戦略に応じて変わる可能性がありますが、m1m2の数は同じになることに注意してください。

13
runners3431

実際に Akra-Bazziの式 を使用して数学を計算し、パーティションの数をパラメーターとして残して、そのパラメーターに対して最適化すると、e(= 2.718 ...)パーティションが最速のパフォーマンス。ただし、実際には、言語の構成要素、CPUなどはすべてバイナリ演算用に最適化されているため、2つのセットへの標準のパーティション分割が最も高速になります。

12
Autoplectic

それは、パーティションがピボットよりも小さく、等しく、そして大きい要素である場合の、ダイクストラのパーティショニング方法に関連していると思います。小さいパーティションと大きいパーティションのみを再帰的にソートする必要があります。インタラクティブな視覚化を見て、それを the walnut で遊ぶことができます。私が使用した色は赤/白/青です。分割の方法は通常「オランダの旗問題」と呼ばれているためです。

1

3ウェイクイックソートは、基本的に配列を3つの部分に分割します。最初の部分はピボットよりも小さく、2番目の部分はピボットに等しく、3番目の部分はピボットよりも大きくなります。これは線形時間分割アルゴリズムです。このパーティションは、オランダの国旗の問題に似ています。

0
Vartika Sharma