python中的快速排序和递归

时间:2012-03-26 00:49:59

标签: python recursion quicksort

我正在尝试使用2个主要功能 - partition和quicksort在Python中实现quicksort。 分区函数的设计使它返回2个数组 - 大于小于p。 之后,快速排序将分别调用它们。 所以quicksort就是这样的:

def quicksort(array)
    pivot = 0 # pivot choice is irrelevant
    left,right = partition(array,pivot)
    quicksort(left)
    quicksoft(right)
    return left+right

但根据我的理解,应该可以设计分区以返回一个单独的索引 - 分隔更大和更小的数组并重新设计快速排序如下:

def quicksort(array)
    pivot = 0 # pivot choice is irrelevant
    i = partition(array,pivot)
    quicksort(array[:i-1])
    quicksoft(array[i:])
    return array

但此实现返回部分排序的数组

original array [5, 4, 2, 1, 6, 7, 3, 8, 9]
sorted array [3, 4, 2, 1, 5, 7, 6, 8, 9]

我在这里缺少什么?

3 个答案:

答案 0 :(得分:4)

在没有看到您的代码的情况下很难确定,但一个可能的错误是i-1

>>> [1,2,3,4][:2]
[1, 2]
>>> [1,2,3,4][2:]
[3, 4]

(虽然你可能只是在跳过枢轴?)

另外,切片是新列表,而不是视图:

>>> l = [1,2,3,4]
>>> l[2:][0] = 'three'
>>> l
[1, 2, 3, 4]

这是不幸的(典型的功能程序做快速排序,根本不是快速排序,该死,因为它创造了一堆新阵列也让我很烦恼...)

你可以通过传递整个列表加上lo / hi指数来解决第二个问题:

def quicksort(data, lo=0, hi=None):
    if hi is None: hi = len(data)
    ....

答案 1 :(得分:1)

quicksort(array[:i-1])实际上并没有在数组的第一个分区上调用quicksort,而是在数组的第一个分区的副本上调用quicksort。因此,您的代码将数组分区到位,然后创建一半的副本并尝试对它们进行排序(但从不对结果数组执行任何操作),因此您的递归调用无效。

如果你想这样做,你将不得不避免使用切片复制列表,而是传递整个列表以及你希望函数应用的范围。

答案 2 :(得分:0)

我有同样的问题,我的快速排序返回了部分排序列表。我发现问题是我没有在它自己的数组中返回数据透视表。当我为pivot创建一个数组时,它允许递归正常工作。

即。我的分区函数返回而不是:

左,右

它返回

左转,枢轴转移,右转