繁体   English   中英

归并排序算法的递归

[英]Recursion of merge sort algorithm

几天前我开始学习 python,我试图解决排序算法。 我最近开始使用归并排序算法。 python(据我所知)中的典型合并排序程序包括合并 function 和合并排序 function。 以下几行在我见过的所有程序中都很常见:

left = mergesort(left)
right = mergesort(right)
merge(left, right)

例如在这段代码中:

def divide_arr(a):    #same as mergesort function
    l = len(a)
    if l <= 1: return a
    left = a[0:int(l/2)]
    right = a[int(l/2):l]
    left = divide_arr(left)
    right = divide_arr(right)
    return merge(left, right, a)

def merge(left, right, arr):
    pl, pr, pa = 0, 0, 0
    while pl <len(left) and pr < len(right):
        if left[pl] <= right[pr]:
            arr[pa] = left[pl]
            pa += 1
            pl += 1
        elif left[pl] > right[pr]:
            arr[pa] = right[pr]
            pa += 1
            pr += 1
    while pl < len(left):
        arr[pa] = left[pl]
        pa += 1
        pl += 1
    while pr < len(right):
        arr[pa] = right[pr]
        pa += 1
        pr += 1
    return arr

我真的不确定编译器如何解释这些行。

让我们取一个数组 [4,3,2,1]。 所以当我调用mergesort时,第一个Left数组变为= [4,3]和right = [2,1]

现在,当我为左数组递归调用 mergesort 时,我最终应该得到 left = [4] ,然后我将它称为右数组,它应该变成 = [1]

所以,我应该合并 [4] 和 [1],它应该返回 [1,4] 作为最终的排序数组。 但是,情况并非如此,代码确实返回了正确的排序数组。

编译器是否有不同的方式来解释这个递归代码? 还是我上面写的东西错了?

PS:我知道这里已经回答了类似的问题,但是它们不处理这些特定的代码行,而是提供了合并排序的一般概念

您的程序是逐行执行的。 function 调用暂停当前 function 的执行并等待被调用的 function 返回。 当递归调用 function 时(即使它是间接调用,其中a调用bb调用a ),您基本上会得到 function 的“新副本”,具有自己的局部变量和自己的独立执行。 在您的示例中,以下是调用的顺序。 缩进显示 function 正在外部级别调用 function(它将等待它返回)。 请注意, return不是 function; 相反,它会停止它在里面的 function。 我假设在mergesort结束时发生的事情是它返回merge的结果。

mergesort([4, 3, 2, 1])
  mergesort([4, 3])
    mergesort([4])
      return [4] to mergesort([4, 3])
    mergesort([3])
      return [3] to mergesort([4, 3])
    merge([4], [3])
      return [3, 4] to mergesort([4, 3])
    return [3, 4] to mergesort([4, 3, 2, 1])
  mergesort([2, 1])
    exercise: figure out the rest :-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM