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

时间:2016-10-12 16:35:32

标签: 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)

ORIGINAL:它没有抛出错误所以我不会在我犯错误的地方。

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

1 个答案:

答案 0 :(得分:2)

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

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

我纠正了几个代码错误:

  1. 删除了“在此处输入代码”文本,这导致了明显的编译错误。
  2. 更正了缩进,以便最后三行现在是您的主程序。
  3. 更正了主程序调用: quicksort 获取数组的边界(下标),但是你自己传入了数组元素。
  4. 这可以解决您遇到的问题。由于未正确处理返回值,您现在具有无限递归。此外,您的主程序会破坏已排序的数组,因为快速排序不会返回任何内容。最终的印刷语句将给出作为结果。

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

    • Python循环包含结束值。您的给定循环将通过 lo 通过 len(A)-2 运行 j ,因此您永远不会处理该值的最后一个值列表。
    • 维基百科中给出的上限是 hi ,而不是列表结尾。

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

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

    为什么从功能中返回A?维基百科算法不会这样做,并且没有必要:您已经更改了列表。

    由于您已经知道多个赋值,请注意交换两个值的方法更简单:

    a, b = b, a
    

    这是否能帮助您解决当前的问题,足以让您重新回到所需的学习轨道上?

相关问题