我的程序最终没有返回正确的问题,但在中间结果中显示正确的问题。我需要帮助,谢谢。
输出样本:
sort begin: A,start,end [3, 5, 2, 1, 7, 6, 8, 4] 0 7
sort begin: A,start,end [2, 1, 3, 5, 7, 6, 8, 4] 0 1
sort begin: A,start,end [1, 2, 3, 5, 7, 6, 8, 4] 3 7
sort begin: A,start,end [1, 2, 3, 4, 5, 6, 8, 7] 3 3
sort begin: A,start,end [1, 2, 3, 4, 5, 6, 8, 7] 5 7
sort begin: A,start,end [1, 2, 3, 4, 5, 6, 8, 7] 5 4
sort begin: A,start,end [1, 2, 3, 4, 5, 6, 8, 7] 6 7
####################################################
final result [1, 2, 3, 5, 4, 6, 8, 7]
我的代码:
def qSort(A,start,end):
print "sort begin: A,start,end",A,start,end
if start >= end:
return A
elif end == start + 1:
if A[start] > A[end]:
A[start],A[end] = A[end],A[start]
return A
else:
i = start + 1
j = i
p = A[start]
while j < end:
j = j + 1
if p > A[j]:
A[i],A[j] = A[j],A[i]
i = i + 1
A = A[0:start] + A[start+1:i]+ [p] + A[i:end+1]
qSort(A,start,i-2)
qSort(A,i,end)
return A
print "###################"
myarray = [3,5,2,1,7,6,8,4]
result = qSort(myarray,0,7)
print "final result",result
答案 0 :(得分:0)
抱歉,我缺乏光彩的评论。我查看了你的代码并意识到它是正确的!你有一个小的编码错误,我会指出然后解释。在您目前拥有的else
区块中:
else:
# Bunch of correct stuff
# ...
# Stuff that is ALMOST correct
qSort(A,start,i-2)
qSort(A,i,end)
return A
您需要将其更改为:
else:
# Bunch of correct stuff
# ...
# Stuff that is definitely correct
A = qSort(A,start,i-2)
A = qSort(A,i,end)
return A
如果不深入研究,您的函数不会区分列表引用和新创建的列表。如果您在print A
之前的elif
块中放置return A
,您会注意到在最后一次迭代中,您的排序按原样正确执行,并生成正确的列表!
不幸的是,产生此更改的调用是我上面提到的调用排序的行之一,但不存储递归函数调用返回的结果列表!
我的简单更改只是将从辅助函数调用返回的修改后的列表带到qSort并重新分配变量A.
奇怪的是,这种行为实际上对你有用,原因是我无法完全解释(比如第一次进入你的`elif&#39;块做正确的事情并正确修改列表)。我相信有人比我肯定能解释奇怪的行为更聪明。
或者,您可以想出一种简单的方法来计算递归深度(函数调用自身的次数),并在您喜欢的IDE中使用某些断点进行调试时将其打印出来。
以下是全局变量的表现方式:
recursion_depth = -1
def qSort(A,start,end):
global recursion_depth
recursion_depth += 1
print "sort begin: A,start,end,level",A,start,end,recursion_depth
# bunch of code edited out for brevity
# ...
result = qSort(myarray,0,7)
print "final result",result