使用 Python 快速排序



我想知道是否有人可以帮助我修复我的快速排序代码的错误:它不会编译并以红色突出显示代码的最后一行。我无法弄清楚出了什么问题。sort 已经定义为一个函数,那么为什么它被突出显示为红色?

def sort(*myarray):
    less = []
    equal = []
    greater = []
    if len(myarray) > 1:
        pivot = myarray[0]
        for x in myarray:
            if x < pivot:
                less.append(x)
            if x == pivot:
                equal.append(x)
            if x > pivot:
                greater.append(x)
        return sort(less)+sort(equal)+sort(greater)
    else:
        return myarray
print sort([12,4,5,6,7,3,1,15])

您将函数定义为接受可变数量的参数(*myarray位(,但当它是包含要排序的列表的列表时,则将内部myarray用作单个参数(要排序的列表(。

您可能应该从函数参数中删除*。这个问题解释得很透彻。

你可以保留*,但你必须玩一些元组解包才能得到相同的结果。

编辑

尽管上述情况是正确的,但这可能不是您遇到的问题。

IDLE 会在 ast 行上给出无效的语法错误,因为在交互模式下 - 行以 >>> 开头,它一次只接受一个语句。在您的情况下,该语句是sort()定义。

尝试在函数定义后按回车键 2 次,这应该会让您回到 repl,您可以在其中引入另一个语句 ( print sort([12,4,5,6,7,3,1,15]) (

有几件事出错,这让我很好奇你是如何测试这个的:

  1. Python代码不是"编译"的,而是被解释的。 (好吧,不完全正确;它被解析为一种字节码;尽管如此,它的编译意义与C等语言不同,在C语言中,整个程序必须转换为机器指令才能运行。你还提到最后一行代码以红色突出显示 - 通过什么?
  2. 此代码实际上有效,但前提是您在 def sort(*myarray): 中远程myarray前面的星号/星号。 否则,它实际上返回一个包含原始数组的单元素元组。

假设你有两个或多个元素在某个点等于一个枢轴,你会得到一个无限循环,因为你将得到: equal = [x,x](至少两个元素(,然后调用 sort([x,x]) ,而 反过来将x作为枢轴,并创建equal = [x,x],并导致sort([x,x]),....

这个问题的简单解决方案:sort(equal)的输出应该是什么?如何对相同元素的列表进行排序?

编辑:好吧,您的评论表明您正在寻找一个不同的问题,但我会把它留在这里,因为它解释了您在代码中遇到的不同问题,应该得到解决。

如果它是一个用于快速排序的函数,你真的可以在其中使用函数排序吗?

这样的事情行不通吗?

def qsort(list):
    pivind=0 
    left, right, pivot= [], [], []
    for x in list:
        if list[pivind]==x: pivot.append(x)
        elif list[pivind]>x: left.append(x)
        else: right.append(x)
    if len(left)>1: left=qsort(left)
    if len(right)>1: right=qsort(right)
    return (left + pivot + right)

最新更新