Python 合并排序算法的递归

Python 合并排序算法的递归,python,recursion,mergesort,Python,Recursion,Mergesort,几天前我开始学习python,当时我正在尝试解决排序算法。我最近开始使用合并排序算法。python中的典型合并排序程序(据我所知)包括一个合并函数和一个合并排序函数。以下几行代码在我看过的所有程序中都很常见: left = mergesort(left) right = mergesort(right) merge(left, right) 例如,在本代码中: def divide_arr(a): #same as mergesort function l = len(a)

几天前我开始学习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
def divide_arr(a):#与合并排序功能相同
l=len(a)

如果你的程序是逐行执行的。函数调用暂停当前函数的执行,并等待被调用函数返回。当递归调用一个函数时(即使是间接调用,
a
调用
b
b
调用
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 :-)

请重复介绍之旅,尤其是和。您发布的代码缺少特定实现的上下文。此外,您对源代码的描述也不正确:许多网站都采用了合并排序的详细机制。您可以通过插入战略性的
print
语句来实现这一点,这是程序员经常使用的一种调试技术。在那里,完成了,
print
ed t恤…:-)我认为Python的编译器与此无关(翻译成字节码)。您可能正在考虑执行字节码的解释器。有很多关于mergesort和的解释。如果上下文是否决票的唯一原因,我将添加我昨天编写的完整代码,我没有添加它只是因为问题会变得不必要的冗长。