我想知道是否有人可以帮助我修复我的快速排序代码的错误:它不会编译并以红色突出显示代码的最后一行。我无法弄清楚出了什么问题。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])
(
有几件事出错,这让我很好奇你是如何测试这个的:
- Python代码不是"编译"的,而是被解释的。 (好吧,不完全正确;它被解析为一种字节码;尽管如此,它的编译意义与C等语言不同,在C语言中,整个程序必须转换为机器指令才能运行。你还提到最后一行代码以红色突出显示 - 通过什么?
- 此代码实际上有效,但前提是您在
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)