【问题标题】:Does Hoare partioning fail in some cases?在某些情况下,Hoare 分区会失败吗?
【发布时间】:2023-04-01 14:03:01
【问题描述】:

正在研究 Hoare 分区问题,并意识到在左右指针同时遇到等于枢轴的值的情况下,Hoare 分区似乎无法正确排序项目。

例如对于数组[0,2,1,0,2,1,2,0],如果你选择1作为主元,左右指针会同时遇到两个1,交换它们,然后继续,给出不正确的@输出987654322@

这是已知的 Hoare 分区问题吗?人们通常如何处理这种情况?

作为参考,这是我正在使用的代码:

def hoarePartition(nums):
    left, right = -1, len(nums) 
        while True:
            left += 1
            while nums[left] == 0:
                left += 1
            right -= 1
            while nums[right] == 2:
                right -= 1
            if left >= right:
                return
            nums[left], nums[right] = nums[right], nums[left]

【问题讨论】:

    标签: algorithm sorting quicksort


    【解决方案1】:

    分区的目的不是排序元素,而是拆分(又名partition)两个非空组,其中一个元素小于或等于枢轴元素和元素大于或等于枢轴元素的元素。 (Hoare 分区允许任一组包含等于枢轴的元素,而 Lomuto 分区将所有等于枢轴的元素放在正确的组中。快速排序可以处理任一结果,但重要的是两个组都不为空;否则,快速排序可能会无限递归,而无法将列表拆分为更小的部分。)

    鉴于此,我们看到您的示例输出是有效的:算法在中间停止,并且左半部分的所有值都小于或等于 1,并且右半部分的所有元素都大于或等于 1。分区内的顺序无关紧要;对数字进行实际排序是 Quicksort 的工作。

    但是,您的实施存在一些问题:

    • 如果唯一的值是 0、1 和 2,则比较 0 和 2 有效。在一般情况下,您需要改为与枢轴元素的值进行比较。
    • 因此,需要将枢轴选择融入您的代码中。它应该是中间的元素,如果有偶数个元素,它应该是中间的左侧。
    • 需要返回right,表示两个组的分割位置。

    【讨论】:

    • 啊,我明白了。我试图看看这是否可以用来解决荷兰国旗问题(因此我要与这些特定数字而不是枢轴进行比较),但现在我明白了为什么 Hoare 分区不适用于该问题。感谢您的澄清!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 2018-04-28
    • 1970-01-01
    • 2022-11-25
    相关资源
    最近更新 更多