3ウェイパーティションを備えたQuickSortとは何ですか?
配列を描く:
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です3(n)通常のクイックソートのnlogとは少しずつ異なります2(n)。
3ウェイパーティションはDjstrkaによるものだと思います。
要素が{ 3, 9, 4, 1, 2, 3, 15, 17, 25, 17 }
の配列について考えてみましょう。
基本的には、3つのパーティションを設定します。特定のピボットより小さい、等しい、より大きいです。 equal-toパーティションは、すべての要素がすでに等しいため、さらにソートする必要はありません。
たとえば、最初の3
をピボットとして選択した場合、Dijkstraを使用する3ウェイパーティションは元の配列を配置し、2つのインデックスm1
とm2
を返し、インデックスがm1
より小さいすべての要素が3
より低くなるように、すべてインデックスがm1
以上でm2
以下の要素は3
と等しくなり、インデックスがm2
より大きいすべての要素は3
より大きくなります。
この特定のケースでは、結果の配列は{ 1, 2, 3, 3, 9, 4, 15, 17, 25, 17 }
になり、値m1
およびm2
はm1 = 2
およびm2 = 3
になります。
結果の配列は、パーティション化に使用される戦略に応じて変わる可能性がありますが、m1
とm2
の数は同じになることに注意してください。
実際に Akra-Bazziの式 を使用して数学を計算し、パーティションの数をパラメーターとして残して、そのパラメーターに対して最適化すると、e(= 2.718 ...)パーティションが最速のパフォーマンス。ただし、実際には、言語の構成要素、CPUなどはすべてバイナリ演算用に最適化されているため、2つのセットへの標準のパーティション分割が最も高速になります。
それは、パーティションがピボットよりも小さく、等しく、そして大きい要素である場合の、ダイクストラのパーティショニング方法に関連していると思います。小さいパーティションと大きいパーティションのみを再帰的にソートする必要があります。インタラクティブな視覚化を見て、それを the walnut で遊ぶことができます。私が使用した色は赤/白/青です。分割の方法は通常「オランダの旗問題」と呼ばれているためです。
3ウェイクイックソートは、基本的に配列を3つの部分に分割します。最初の部分はピボットよりも小さく、2番目の部分はピボットに等しく、3番目の部分はピボットよりも大きくなります。これは線形時間分割アルゴリズムです。このパーティションは、オランダの国旗の問題に似ています。