3-way partitioning 将数组拆分为3个子数组:elements< pivot,elements == pivot,elements>枢。
我们可以使用众所周知的E. Dijkstra“荷兰国旗问题”解决方案来做到这一点,但Bentley and McIlroy建议另一个way(参见第22节,“快速三向分区“)
不幸的是我不明白 他们的算法更好(更快)。有人能慢慢解释一下吗?
答案 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左右)的不同元素,我认为“荷兰旗”将会更优越,但总的来说,替代方案将使用更少的掉期,直到待分类的部分变得相当小。