python中的快速排序和递归

python中的快速排序和递归,python,recursion,quicksort,Python,Recursion,Quicksort,我正在尝试使用两个主要函数在Python中实现快速排序—分区和快速排序。 分区函数的设计使得它返回2个数组——比p大和比p小。 之后,分别对它们两个调用快速排序。 因此,快速排序的工作原理如下: def quicksort(array) pivot = 0 # pivot choice is irrelevant left,right = partition(array,pivot) quicksort(left) quicksoft(right) ret

我正在尝试使用两个主要函数在Python中实现快速排序—分区和快速排序。 分区函数的设计使得它返回2个数组——比p大和比p小。 之后,分别对它们两个调用快速排序。 因此,快速排序的工作原理如下:

def quicksort(array)
    pivot = 0 # pivot choice is irrelevant
    left,right = partition(array,pivot)
    quicksort(left)
    quicksoft(right)
    return left+right
但根据我的理解,应该可以将分区设计为只返回一个索引,即划分大小数组,并重新设计quicksort,如下所示:

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]

我在这里遗漏了什么?

如果没有看到您的代码,很难确定,但一个可能的错误是
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)
    ....
快速排序(数组[:i-1])
实际上并不在数组的第一个分区上调用快速排序,而是在数组的第一个分区的副本上调用快速排序。因此,您的代码在适当的位置对数组进行分区,然后创建半个数组的副本并尝试对它们进行排序(但从未对生成的数组执行任何操作),因此递归调用没有任何效果


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

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

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

向左、向右返回

它回来了


return left,pivotval,right

你确信你的新的
分区()函数可以修改数组吗?我写了一个非常类似的分区函数,它使用高低索引,而不是到处复制列表。希望它能作为一般规则有所帮助:如果函数在原地修改它的参数,它应该返回
None
,例如,
L.sort()vs.sorted(L)