python - WIKIPEDIA 在 python 中所说的快速排序算法

标签 python algorithm quicksort wikipedia

在维基百科中,有一段快速排序算法的伪代码:

所以我尝试用 python 实现,但它没有对任何东西进行排序。

def partition(A,lo,hi):
    pivot = A[hi]
    i=lo
    #Swap
    for j in range(lo,len(A)-1):
        if (A[j] <= pivot):
            val=A[i]
            A[i]=A[j]
            A[j]=val
            i=i+1
        val=A[i]
        A[i]=A[hi]
        A[hi]=val
    return(A,i)

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

A=[5,3,2,6,8,9,1]
A=quicksort(A, 0, len(A)-1)
print(A)

原文:它不会抛出错误,所以我不知道哪里出错了。

更新:它现在进入无限递归。

最佳答案

它不会抛出错误或打印任何东西,因为没有主程序可以运行任何东西。您缩进了应该是主程序的内容,因此它现在是 quicksort 函数的一部分。

此外,这段代码确实抛出错误,因为您在发布的内容中留下了评论。我会清理代码并编辑您的帖子。


我更正了几个代码错误:

  1. 删除了“在此处输入代码”文本,该文本会导致明显的编译错误。
  2. 更正了缩进,现在最后三行是您的主程序。
  3. 更正了主程序调用:quicksort 采用数组的边界(下标),但您传入的是数组元素本身。

这解决了您给定的问题。由于没有正确处理返回值,您现在有无限递归。此外,您的主程序会破坏已排序的数组,因为 quicksort 不会返回任何内容。最终的打印语句将给出 None 作为结果。


您还没有完全实现给定的算法。最重要的问题是for 循环的上限。

  • Python 循环包括结束值。您给定的循环将运行 j 通过值 lolen(A)-2,因此您永远不会处理列表。
  • 维基百科给出的上限是hi,不是列表末尾。

解决这些问题,您将接近解决方案。

此外,我强烈建议您坚持使用几个跟踪 print 语句,这样您就可以了解程序是如何工作的。例如,作为每个函数的第一条语句,打印函数名称和输入参数。

为什么要从函数返回 A?维基百科算法不会这样做,也没有必要:您就地更改了列表。

既然您已经知道多重赋值,请注意有一种更简单的方法来交换两个值:

a, b = b, a

这是否能让您解决当前的问题,足以让您回到想要的学习轨道?

关于python - WIKIPEDIA 在 python 中所说的快速排序算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40003839/

相关文章:

python - Matplotlib:imshow 中的 set_data 对绘图没有影响

python - 按类型查找列表中的项目

algorithm - TopCoder 算法 : BrightLamps -- n lamp

algorithm - 创建从根连接的有向图所需的最小边数

python - Pandas pct_change 不支持的操作数/对于 str 和 float

python - 在 pandas 中访问存储在 s3 上的 HDF 文件

python - 遍历生成器序列

Java 列表/递归错误

algorithm - 快速排序的实现

c++ - 快速排序 C++ 实现(使用随机基准)中断并陷入无限循环