QuickSort返回正确的值,但不进行排序

时间:2013-07-20 08:04:24

标签: python quicksort

我很难理解为什么我的QuickSort 正确返回排序值,但生成的数组没有正确排序。

def qSort(array):
    n = len(array)
    if (n == 1 or n ==0):
            return array
    p_index = partition(array)
    p_value = array[p_index]
    return(qSort(array[0:p_index]) + [p_value] + qSort(array[p_index+1:n]))

def partition(array):
    pivot = array[0]
    i = 1
    for j in xrange(1,len(array)):
        print j
        if array[j] < pivot:
            tmp = array[j]
            array[j] = array[i]
            array[i]=tmp
            i += 1
    tmp = array[i-1]
    array[i-1] = pivot
    array[0] = tmp
    return i-1

以下是一些示例输出:

>>> q = [5,4,3,2,1]
>>> qSort(q)
[1, 2, 3, 4, 5]
>>> q
[1, 4, 3, 2, 5]

提前谢谢!

4 个答案:

答案 0 :(得分:2)

这是因为您在return声明中填写了新列表。

return(qSort(array[0:p_index]) + [p_value] + qSort(array[p_index+1:n]))

如果qSort函数达到基本情况,则返回一个列表,该列表与[p_value]连接并作为list返回。您不会在任何地方对list传递的内容进行更改。

当你递归调用qSort函数时,你给它一个列表的一部分,函数返回基本情况下的列表,然后你追加到pivot和另一个递归调用,因此生成一个新列表。

通过将qSort功能更改为

来查看发生的情况
def qSort(array):
    n = len(array)
    if (n == 1 or n ==0):
            return array
    p_index, array = partition(array)
    p_value = array[p_index]
    returnVal = qSort(array[0:p_index]) + [p_value] + qSort(array[p_index+1:n])
    print "Returning:", returnVal, "Original Array:", array
    return returnVal

输出 -

>>> q = [5,4,3,2,1]
>>> qSort(q)
Returning: [2, 3] Original Array: [2, 3]
Returning: [2, 3, 4] Original Array: [2, 3, 4]
Returning: [1, 2, 3, 4] Original Array: [1, 4, 3, 2]
Returning: [1, 2, 3, 4, 5] Original Array: [1, 4, 3, 2, 5]
[1, 2, 3, 4, 5]

要反映原始list的更改,您可以选择q = qSort(q)

P.S - 设置随机索引而不是第一个值对于quicksort函数会更好。请参阅Choice of Pivots上的位here

答案 1 :(得分:1)

在Python中,切片和组合列表会创建新列表。如果您希望递归调用在单个列表上运行,请将列表和边界传递给调用,并且不要从函数返回任何内容。类似的东西:

def qsort(array, low, high):
    if high-low < 2:
        return

    # Choose pivot, do partition within bounds

    if partition > low:
        qsort(array, low, partition)
    if partition < high:
        qsort(array, partition+1, high)

然后只需调用qsort(a, 0, len(a))对数组进行排序。

答案 2 :(得分:0)

将该功能应用回q

q = qSort(q)

答案 3 :(得分:0)

如果要返回数组并进行排序,则应在返回之前使数组等于结果,而不是重新生成数组。您可以通过将return语句更改为:

来实现
    array[:] = qSort(array[0:p_index]) + [p_value] + qSort(array[p_index+1:n])
    return array

请注意

    array = qSort(array[0:p_index]) + [p_value] + qSort(array[p_index+1:n])

也不起作用,因为lhs变量将被视为局部变量。