Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 三向划分算法_Algorithm_Partitioning_Quicksort - Fatal编程技术网

Algorithm 三向划分算法

Algorithm 三向划分算法,algorithm,partitioning,quicksort,Algorithm,Partitioning,Quicksort,3向分区将一个数组拆分为3个子数组:elementspivot 我们可以使用E.Dijkstra的“荷兰国旗问题”的著名解决方案来实现这一点,但可以提出另一种解决方案(请参见第22节“快速三向分区”) 不幸的是,我不明白他们的算法如何更好(更快)。有人能解释得慢一点吗?它平均使用较少的交换,至少在阵列中不同元素不太少的情况下是这样 “Dutch Flag”算法对不等于枢轴的每个元素使用一次交换,因此 n - multiplicity(pivot) 互换 另一种方法是,首先将与枢轴相等的元素交换

3向分区将一个数组拆分为3个子数组:elementspivot

我们可以使用E.Dijkstra的“荷兰国旗问题”的著名解决方案来实现这一点,但可以提出另一种解决方案(请参见第22节“快速三向分区”)


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

它平均使用较少的交换,至少在阵列中不同元素不太少的情况下是这样

“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向分区。