Quicksort有3路分区

Cod*_*313 35 algorithm quicksort

具有3路分区的QuickSort是什么?

jjn*_*guy 52

画一个数组:

3, 5, 2, 7, 6, 4, 2, 8, 8, 9, 0
Run Code Online (Sandbox Code Playgroud)

两个分隔快速排序会挑选一个值,即4,并把每一个元素大于4在阵列的一侧,在另一侧上的每一个元素小于4.像这样:

3, 2, 0, 2, 4, | 8, 7, 8, 9, 6, 5
Run Code Online (Sandbox Code Playgroud)

一个三分区快速排序将选择两个值进行分区并以这种方式拆分数组.让我们选择4和7:

3, 2, 0, 2, | 4, 6, 5, 7, | 8, 8, 9
Run Code Online (Sandbox Code Playgroud)

这只是常规快速排序的一个小变化.

您继续对每个分区进行分区,直到对数组进行排序.运行时在技术上是nlog 3(n),它与常规快速排序的nlog 2(n)略有不同.

  • 在做自己的研究时遇到这篇文章......我不得不说我半同意这个答案.是的,它分为3个分区,但只有一个分区,每个分区都是<,=,>.执行上述分区似乎没有在标准2分区之上添加任何好处.对于通过谷歌搜索来的任何人来说,只是我的2便士. (27认同)
  • 现在有趣的问题是:"在什么条件下,n路QS比m路QS更好?" (11认同)
  • 我的意思是有不止一种分区算法。3 路分区(例如 Bentley-McIlroy)只有 1 个枢轴,用于处理重复键。我不知道双支点策略,所以我对它进行了研究。=) 所以你的评论帮助了我。 (2认同)

cgp*_*cgp 16

http://www.sorting-algorithms.com/static/QuicksortIsOptimal.pdf

也可以看看:

http://www.sorting-algorithms.com/quick-sort-3-way

我认为面试问题版本也很有趣.它问,有四个分区版本的快速排序 ...

  • 这似乎是正确的答案.当有许多重复键时,3种快速排序处理性能. (2认同)

run*_*431 13

我认为3路分区是由Djstrka完成的.

想想带有元素的数组{ 3, 9, 4, 1, 2, 3, 15, 17, 25, 17 }.

基本上你设置了3个分区:小于,等于和大于某个分支.等于分区不需要进一步排序,因为它的所有元素已经相等.


例如,如果我们选择第一个3作为枢轴,那么使用Dijkstra的三向分区将排列原始数组并返回两个索引m1,m2使得索引小于的所有元素m1将低于3索引更大的所有元素等于或m1小于或等于m2等于3,并且索引大于的所有元素m2将大于3.

在这种特殊情况下,结果数组可能是{ 1, 2, 3, 3, 9, 4, 15, 17, 25, 17 },而值m1m2将是m1 = 2m2 = 3.

请注意,生成的数组可能会根据用于分区的策略而更改,但数字m1和数字m2会相同.

  • 我认为这应该是正确的答案。 (2认同)

Aut*_*tic 12

如果你真的使用Akra-Bazzi公式计算数学,将分区数作为参数,然后优化该参数,你会发现e(= 2.718 ...)分区提供了最快的性能.然而,在实践中,我们的语言结构,cpus等都针对二进制操作进行了优化,因此标准分区为两组将是最快的.

  • `标准分区到两套将是最快的` - **引用需要** (2认同)