繁体   English   中英

为什么我在 Python 中有快速排序的最大递归深度?

[英]Why do I have maximum recursion depth for Quick Sort in Python?

我正在尝试根据给出的伪代码实现快速排序,并且我了解该算法的工作原理。
当我在 function 上运行测试并且输入列表是随机的时,它运行得非常好。
然而,当我通过 function 运行降序或升序排序列表时,我得到最大递归深度的错误。 据我了解,这是因为我选择的 pivot 不是随机的,因为在元素 900 及以下的输入中,代码工作正常,但是一旦我将 1000 个元素放入随机的列表中,我就会收到该错误。 我不确定 go 如何在不使用 rand function 的情况下随机化它。
我也尝试使用中点,但我的 output 不正确,我无法弄清楚为什么。
任何帮助和解释将不胜感激。

    def quicksort(self, query_list, left, right):
        if left < right:
            mid = self.partition(query_list, left, right)
            self.quicksort(query_list, left, mid - 1)
            self.quicksort(query_list, mid + 1, right)

    def partition(self, query_list, beg, end):
        pivot = query_list[end]
        i = beg - 1
        for j in range(beg, end):
            if query_list[j] >= pivot:
                i = i + 1
                (query_list[i], query_list[j]) = (query_list[j], query_list[i])
        (query_list[i + 1], query_list[end]) = (query_list[end], query_list[i + 1])
        return i + 1

输入一个列表 rand:[3, 4, 8, 2, 0, 1]
Output: [8, 4, 3, 2, 1, 0]

我试过了:

mid = (beg + end) // 2
pivot = query_list[mid]

我的结果:
随机输入列表:[8, 2, 4, 1, 9, 3, 7, 10, 6, 5]
Output: [10, 9, 8, 6, 7, 1, 4, 3, 5, 2]

要使用问题中使用的 Lomuto 分区方案将中间元素用作 pivot,请将中间元素与最后一个元素交换:

    def partition(self, query_list, beg, end):
        mid = (beg+end)/2
        query_list[mid],query_list[end] = query_list[end],query_list[mid]
        pivot = query_list[end]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM