【问题标题】:Algorithms for 3-way partitioning用于 3 路分区的算法
【发布时间】:2012-03-11 03:42:42
【问题描述】:

3 路分区 将一个数组拆分为 3 个子数组:elements pivot。

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

不幸的是,我不明白 如何 他们的算法更好(更快)。谁能慢慢解释一下?

【问题讨论】:

    标签: algorithm partitioning quicksort


    【解决方案1】:

    平均而言,它使用较少的交换,至少在数组中不同元素不会太少的情况下。

    “荷兰国旗”算法对每个不等于主元的元素使用一次交换,所以是

    n - multiplicity(pivot)
    

    交换。

    另一种方法,首先将等于枢轴的元素交换到数组的两端,将每个等于枢轴的元素交换两次(一次到一端,最后到中间),然后将a[i], a[j]i < ja[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,它平均会使用更少的交换。

    因此,如果您先验地知道数组中只有很少(

    【讨论】:

    • 谢谢。我想我明白了。顺便说一句,3 路分区使快速排序稳定是正确的吗?
    • 三向分区不会自动使其稳定,我认为没有太多复杂性是不可能的。我什至不确定是否可以实现稳定的快速排序、2 路或 3 路分区。
    • 基于 3 路分区的数组的快速排序不稳定。但是基于三向分区的链表快速排序可以稳定
    猜你喜欢
    • 2011-01-14
    • 2015-05-13
    • 2018-09-18
    • 2020-09-04
    • 2019-08-18
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 2019-01-08
    相关资源
    最近更新 更多