理解类似mergesort的算法中的递归

时间:2015-02-06 17:47:53

标签: python algorithm recursion mergesort

我想知道这种递归算法的流程是如何工作的:an inversion counter based on merge-sort。当我查看合并排序递归树的图表时,它看起来相当清晰;我认为叶片会一直分裂,直到每片叶子都是一个单元,然后merge()才开始组合它们;因此,开始“回归”。树 - 可以这么说。

但是在下面的代码中,如果我们使用给定的数组print(sortAndCount(test_case))打印出这个函数,那么我们实际上已经得到了我们的最终版本'来自merge()函数的输出,而不是sortAndCount()中的return语句?所以在下面的代码中,我认为sortAndCount()方法会在(invCountA, A) = sortAndCount(anArray[:halfN])中反复调用自己,直到达到基本情况,然后继续处理数组的下一半 - 但现在似乎不正确。有人可以纠正我对这种递归流程的理解吗? (N.b.我截断了merge()方法的一些代码,因为我只对递归过程感兴趣。)

def sortAndCount(anArray):
    N = len(anArray)
    halfN = N // 2

    #base case:
    if N == 1: return (0, anArray)          

    (invCountA, A) = sortAndCount(anArray[:halfN])
    (invCountB, B) = sortAndCount(anArray[halfN:])
    (invCountCross, anArray) = merge(A, B)

    return (invCountA + invCountB + invCountCross, anArray)

def merge(listA, listB):
    counter = 0
    i, j = 0, 0

    #some additional code...
    #...
    #...


    #If all items in one array have been selected, 
    #we just return remaining values from other array:
    if (i == Asize):                                
        return (counter, output_array + listB[j:])
    else:
        return (counter, output_array + listA[i:])

1 个答案:

答案 0 :(得分:2)

使用rcviz创建的以下图像显示了递归调用的顺序,如文档中所述,边缘按执行遍历它们的顺序编号。边缘从黑色着色灰色表示遍历顺序:黑色边缘优先,灰色边缘最后。

enter image description here

因此,如果我们仔细按照步骤操作,我们会看到首先我们完全遍历原始数组的左半部分,然后是右边。