【问题标题】:How is the merge function calling the merge_sort function?合并函数如何调用merge_sort函数?
【发布时间】:2020-03-31 07:10:53
【问题描述】:
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) 语句再次运行merge_sort() 时卡住了。

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

【问题讨论】:

  • 当它一直到最后一个元素并且函数总是返回一个排序数组时,就会发生魔法。这可能会有所帮助youtube.com/watch?v=JSceec-wEyw

标签: python-3.x algorithm sorting mergesort


【解决方案1】:

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

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

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)

【讨论】:

    【解决方案2】:

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

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

    只有merge_sort() 递归调用自身,将其列表参数拆分为左右部分,直到它减少为单个元素。每组递归调用之后都有一个合并阶段,其中排序的子列表被合并到返回给其调用者的排序子列表中......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      • 2014-10-05
      • 1970-01-01
      相关资源
      最近更新 更多