我正在尝试使用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]
我在这里缺少什么?
答案 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创建一个数组时,它允许递归正常工作。
即。我的分区函数返回而不是:
左,右
它返回
左转,枢轴转移,右转