我的 python 递归快速排序算法有啥问题?

Posted

技术标签:

【中文标题】我的 python 递归快速排序算法有啥问题?【英文标题】:What is wrong with my python recursive quick sort algorithm?我的 python 递归快速排序算法有什么问题? 【发布时间】:2021-12-31 13:19:20 【问题描述】:

所以我的算法有两个功能。第一个是partition,它将列表的第一个元素作为枢轴,并将所有大于它的元素放在它之后,所有最小的元素放在它之前,我已经对其进行了测试,它工作得很好。第二个函数quicksort 函数,它使用partition 递归地对整个列表进行排序。当我在 pycharm 中运行代码时,它说超出了最大递归深度和一些其他错误。代码如下:

arr = [81, 4, 73, 1, 98, 69, 300, 14, 7, 420, 190, 8, 9]


def partition(low, high):
    lo = low
    hi = high
    pivot = arr[lo]
    while lo < hi:
        while arr[lo] <= pivot:
            lo += 1
        while arr[hi] > pivot:
            hi -= 1
        if hi > lo:
            arr[lo], arr[hi] = arr[hi], arr[lo]
    arr[0], arr[hi] = arr[hi], arr[0]
    return hi


def quicksort(l, h):
    if l < h:
        j = partition(l, h)
        quicksort(l, j)
        quicksort(j + 1, h)


quicksort(0, 12)
print(arr)

P.S.:我是一个初学者(只有2个月的python)所以请尽量简单地解释一下。 提前致谢!

【问题讨论】:

我刚刚被告知必须使用它也许你可以问问告诉你的人。 我非常怀疑您的 partition 功能是否正常工作。 删除它并测试你的算法。如果它有目的,比常数 100000 更好的选择是 max(arr)+1,因为它显然意味着比任何数组元素都大。 User1984.. 它工作我自己测试了它。这些错误都与recision部分有关 我删除了 inf 部分仍然是同样的错误。 【参考方案1】:

您的 partition 功能有缺陷。此外,您应该通过传递对列表的引用而不是处理全局变量来使您的函数更加灵活/可重用。这是我使用 Hoare 算法和选择枢轴的不同方法的实现:

def partition(A, lo, hi):
    pivot = A[(lo+hi)//2]
    i = lo - 1
    j = hi + 1
    while True:
        i += 1
        while A[i] < pivot:
            i += 1
        j -= 1
        while A[j] > pivot:
            j -= 1
        if i >= j:
            return j
        A[i], A[j] = A[j], A[i]


def quicksort(A, lo, hi):
    if lo < hi:
        p = partition(A, lo, hi)
        quicksort(A, lo, p)
        quicksort(A, p + 1, hi)


arr = [81, 4, 73, 1, 98, 69, 300, 14, 7, 420, 190, 8, 9, 1, 2, 3, 9]
quicksort(arr, 0, len(arr)-1)
print(arr)

【讨论】:

我不明白我的分区和你的分区有什么大的区别。有什么缺陷?尝试运行它。另外,愚蠢的问题,但 return j 语句是否使程序退出无限循环? 注意你有两个“交换”,是的,return 终止了返回 j 值的函数。尝试运行我的代码

以上是关于我的 python 递归快速排序算法有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

python --- 快速排序算法

Python算法之快速排序

递归深度截止策略:并行快速排序

基础算法| 快速排序 (C++ 和 python实现)

快速排序算法的简单理解

快速排序算法学习(C语言和python代码对比)