Algorithm 三向划分算法
3向分区将一个数组拆分为3个子数组:elementsAlgorithm 三向划分算法,algorithm,partitioning,quicksort,Algorithm,Partitioning,Quicksort,3向分区将一个数组拆分为3个子数组:elementspivot 我们可以使用E.Dijkstra的“荷兰国旗问题”的著名解决方案来实现这一点,但可以提出另一种解决方案(请参见第22节“快速三向分区”) 不幸的是,我不明白他们的算法如何更好(更快)。有人能解释得慢一点吗?它平均使用较少的交换,至少在阵列中不同元素不太少的情况下是这样 “Dutch Flag”算法对不等于枢轴的每个元素使用一次交换,因此 n - multiplicity(pivot) 互换 另一种方法是,首先将与枢轴相等的元素交换
不幸的是,我不明白他们的算法如何更好(更快)。有人能解释得慢一点吗?它平均使用较少的交换,至少在阵列中不同元素不太少的情况下是这样 “Dutch Flag”算法对不等于枢轴的每个元素使用一次交换,因此
n - multiplicity(pivot)
互换
另一种方法是,首先将与枢轴相等的元素交换到数组的两端,将每个元素与枢轴相等交换两次(一次交换到一端,最后交换到中间),然后将成对的a[i],a[j]
与i
和a[j]
交换,即
2*multiplicity(pivot) + count(bad_pairs)
互换。坏对的数量不能超过(n-多重性(pivot))/2
,而且通常(随机数组)更小,从我的头顶上看,我希望类似(n-多重性(pivot))/4的东西平均更少。因此,如果多重性(枢轴)
,则替代方案保证使用较少的互换,如果我的估计正确,如果多重性(枢轴)<3*n/11,则平均使用较少的互换
所以如果你先验地知道只有很少的(谢谢。我想我明白了。顺便说一句,3向分区使快速排序稳定是正确的吗?3向分区不会自动使其稳定,我认为这不可能不太复杂。我甚至不确定是否可以实现稳定的快速排序、2向或3向分区。