quicksort分而治之后返回错误的部分答案

时间:2014-08-19 21:37:55

标签: python debugging quicksort divide-and-conquer

我的程序最终没有返回正确的问题,但在中间结果中显示正确的问题。我需要帮助,谢谢。

输出样本:

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

1 个答案:

答案 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