3路分区的算法

时间:2012-03-10 17:37:43

标签: algorithm partitioning quicksort

3-way partitioning 将数组拆分为3个子数组:elements< pivot,elements == pivot,elements>枢。

我们可以使用众所周知的E. Dijkstra“荷兰国旗问题”解决方案来做到这一点,但Bentley and McIlroy建议另一个way(参见第22节,“快速三向分区“)

不幸的是我不明白 他们的算法更好(更快)。有人能慢慢解释一下吗?

1 个答案:

答案 0 :(得分:2)

它平均使用较少的掉期,至少在阵列中没有太少的不同元素时。

“Dutch Flag”算法每个元素使用一个不等于pivot的交换,所以

n - multiplicity(pivot)

互换。

替代方案,首先将等于枢轴的元素交换到数组的末尾,将每个元素等于枢轴两次(一次到一端,最后到中间),然后交换对{{1} } a[i], a[j]i < j,即

a[j] < pivot < a[i]

互换。坏对的数量不能超过2*multiplicity(pivot) + count(bad_pairs) 并且通常(随机数组)更小,从我的头顶开始,我希望平均值(n - multiplicity(pivot))/2或更低。因此,如果(n-multiplicity(pivot))/4,替代方案可以保证使用更少的掉期,如果我的估算是正确的,那么multiplicity(pivot) < n/5会平均使用更少的互换。

因此,如果您事先知道阵列中只有极少数(<= 5左右)的不同元素,我认为“荷兰旗”将会更优越,但总的来说,替代方案将使用更少的掉期,直到待分类的部分变得相当小。