我很难理解为什么我的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]
提前谢谢!
答案 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变量将被视为局部变量。