【发布时间】: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 ask 和MRE。您发布的代码缺少特定实现的上下文。
-
另外,您对您的来源有误:许多 网站了解了合并排序的详细机制。您可以通过插入策略性的
print语句来自己执行此操作,这是一种调试技术,您将使用 lot 作为程序员。去过那里,做到了,printed T 恤... :-) -
如果上下文是投反对票的唯一原因,我将添加我昨天编写的完整代码,我没有添加它只是因为问题会变得不必要地冗长。
标签: python recursion mergesort