【发布时间】:2012-03-11 03:42:42
【问题描述】:
3 路分区 将一个数组拆分为 3 个子数组:elements pivot。
我们可以使用 E. Dijkstra 的“荷兰国旗问题”的著名解决方案来做到这一点,但 Bentley and McIlroy 建议使用另一个 way(参见第 #22 节,“快速三向分区")
不幸的是,我不明白 如何 他们的算法更好(更快)。谁能慢慢解释一下?
【问题讨论】:
标签: algorithm partitioning quicksort
3 路分区 将一个数组拆分为 3 个子数组:elements pivot。
我们可以使用 E. Dijkstra 的“荷兰国旗问题”的著名解决方案来做到这一点,但 Bentley and McIlroy 建议使用另一个 way(参见第 #22 节,“快速三向分区")
不幸的是,我不明白 如何 他们的算法更好(更快)。谁能慢慢解释一下?
【问题讨论】:
标签: algorithm partitioning quicksort
平均而言,它使用较少的交换,至少在数组中不同元素不会太少的情况下。
“荷兰国旗”算法对每个不等于主元的元素使用一次交换,所以是
n - multiplicity(pivot)
交换。
另一种方法,首先将等于枢轴的元素交换到数组的两端,将每个等于枢轴的元素交换两次(一次到一端,最后到中间),然后将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,替代方案保证使用更少的交换,如果我的估计是正确的,如果multiplicity(pivot) < 3*n/11,它平均会使用更少的交换。
因此,如果您先验地知道数组中只有很少(
【讨论】: