使用Python快速排序

时间:2013-08-15 22:44:00

标签: python algorithm sorting

我想知道是否有人可以帮助我修复错误,我的快速排序代码有: 它不会编译并以红色突出显示代码的最后一行。 我无法弄清楚出了什么问题。 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])

4 个答案:

答案 0 :(得分:4)

您将函数定义为采用可变数量的参数(*myarray位),然后将myarray内部用作单个参数(要排序的列表),当它是列出包含要排序的列表。

您可能应该从函数参数中删除*This questions非常彻底地解释它。

你可以保留*,但是你必须使用元组解压缩来获得相同的结果。

修改

虽然上述情况属实,但这可能不是您遇到的问题。

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

尝试在函数定义后输入2次,这会让你回到repl,在那里你可以引入另一个语句(print sort([12,4,5,6,7,3,1,15])

答案 1 :(得分:2)

有一些问题让我很好奇你是如何测试的:

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

答案 2 :(得分:0)

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

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

编辑:嗯,您的评论显示您正在寻找其他问题,但我会将其留在此处,因为它解释了您对代码的不同问题,应该解决。< / p>

答案 3 :(得分:0)

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

不会有这样的工作吗?

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)