首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >merge函数是如何调用merge_sort函数的?

merge函数是如何调用merge_sort函数的?
EN

Stack Overflow用户
提问于 2020-03-31 15:10:53
回答 2查看 47关注 0票数 1
代码语言:javascript
复制
def merge_sort(items):
  if len(items) <= 1:
    return items

  middle_index = len(items) // 2
  left_split = items[:middle_index]
  right_split = items[middle_index:]

  left_sorted = merge_sort(left_split)
  right_sorted = merge_sort(right_split)

  return merge(left_sorted, right_sorted)

def merge(left, right):
  result = []

  while (left and right):
    if left[0] < right[0]:
      result.append(left[0])
      left.pop(0)
    else:
      result.append(right[0])
      right.pop(0)

  if left:
    result += left
  if right:
    result += right

  return result

unordered_list1 = [356, 746, 264, 569, 949, 895, 125, 455]

ordered_list1 = merge_sort(unordered_list1)

我知道当函数merge_sort()第一次被调用时,它会递归地调用自己,直到只剩下一个元素,然后在返回时再次调用merge()函数,该函数将返回一个有序的子列表,但是然后函数merge_sort()如何调用自己来移动到下一个元素呢?我尝试可视化代码,但当return merge(left_sorted, right_sorted)语句再次转到run merge_sort()时遇到了问题。

谁能解释一下在第一次返回一个有序的子列表后,return merge(left_sorted, right_sorted)是如何再次调用merge_sort()的。

EN

回答 2

Stack Overflow用户

发布于 2020-03-31 21:11:44

谁能解释一下return merge(left_sorted,right_sorted)是如何在第一次返回有序的子列表之后再次调用merge_sort()的。

因为调用merge_sort()的前一个实例仍在堆栈上。使用缩进来显示调用的嵌套,以4个元素为例:

代码语言:javascript
复制
ordered_list = call merge_sort(items{0 .. 3})
    left_sorted  = call merge_sort(left_split = items{0..2})
        left_sorted  = call merge_sort(left_split  = items{0}) // base case
        right_sorted = call merge_sort(right_split = items{1}) // base case
        return merge(left_sorted, right sorted)
    right_sorted = call merge_sort (right_split = items{2..3})
        left_sorted  = call merge_sort(left_split  = items{2}) // base case
        right_sorted = call merge_sort(right_split = items{3}) // base case
        return merge(left_sorted, right sorted)
    return merge(left_sorted, right sorted)
票数 0
EN

Stack Overflow用户

发布于 2020-04-01 15:48:44

可以解释一下,在第一次返回一个有序的子列表之后,return merge(left_sorted, right_sorted)是如何再次调用merge_sort()的吗?

merge不调用merge_sort(),它将两个已排序的子列表合并到一个已排序的列表中。

只有merge_sort()递归地调用它自己,将它的列表参数分成左右两部分,直到它被简化为单个元素。每组递归调用之后都有一个合并阶段,在该阶段中,已排序的子列表将合并到一个已排序的子列表中,并返回给其调用者...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60945154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档