【问题标题】:Recursion of merge sort algorithm归并排序算法的递归
【发布时间】:2020-04-10 22:08:32
【问题描述】:

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

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]

现在,当我为左数组递归调用合并排序时,我应该最终得到左 = [4],然后我将它调用为右数组,它应该变为 = [1]

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

编译器解释这个递归代码有不同的方式吗?还是我上面写的有问题?

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

【问题讨论】:

  • 请重复介绍,尤其是how to askMRE。您发布的代码缺少特定实现的上下文。
  • 另外,您对您的来源有误:许多 网站了解了合并排序的详细机制。您可以通过插入策略性的print 语句来自己执行此操作,这是一种调试技术,您将使用 lot 作为程序员。去过那里,做到了,printed T 恤... :-)
  • 我不认为 Python 的编译器在这里是相关的(翻译成字节码)。您可能正在考虑执行字节码的解释器。关于mergesorthereelsewhere有很多解释。
  • 如果上下文是投反对票的唯一原因,我将添加我昨天编写的完整代码,我没有添加它只是因为问题会变得不必要地冗长。

标签: python recursion mergesort


【解决方案1】:

您的程序是逐行执行的。函数调用暂停当前函数的执行并等待被调用函数返回。当一个函数被递归调用时(即使是间接调用,a 调用bb 调用a),你基本上会得到一个函数的“新副本”,它有自己的局部变量和自己的独立执行。在您的示例中,以下是调用的顺序。缩进表明该函数正在被外层的函数调用(它将等待它返回)。请注意,return 不是函数;相反,它会停止它所在的函数。我假设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 :-)

【讨论】:

    猜你喜欢
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 2014-08-12
    相关资源
    最近更新 更多