在研究合并排序几天之后,我从概念上理解它,但有一件事我没有。
我得到了什么:
1。)它需要一个列表,例如一个数字数组,将它分成两半并对两个半部分进行排序,最后将它们合并在一起。
2。)因为它是递归算法,所以它使用递归来做到这一点。 因此,所提到的数组的拆分如下:
它,将数组拆分,直到每个列表中只有一个项目,然后将其视为已排序。在那一点上,合并步入。 这应该是这样的:
我没有得到的是,在将所有列表拆分为列表中的一个项目之后递归“知道”,以便重新获得递归树?左右两侧的东西在合并后如何成为左侧?
困扰我的是这件事。我从interactivepython页面获取了代码的快照在我们将lefthalf = 2和righthalf = 1之后,代码如何到达图片中显示的代码,其中lefthalf = [1,2]和righthalf = [4,3]回到可以分割我们已经合并的递归?
TNX, 汤姆
答案 0 :(得分:1)
"递归"当然不知道那种。它是使用递归的代码,看起来像这样(有点简化):
sort list = merge (sort left_half) (sort right_half)
where
(left_half, right_half) = split list
在这里你可以看到"递归" (即sort
)的递归调用不需要"知道"任何东西。他们唯一的工作就是提供一个排序列表,数组或其他任何东西。
换句话说:如果我们merge
满足以下不变量:
1. `merge`, given two sorted lists, will return a sorted list.
然后我们可以像上面概述的那样轻松编写mergesort。在sort中剩下要做的就是处理简单的情况:空列表,单例和带有两个元素的列表。
答案 1 :(得分:1)
一旦列表只包含一个元素,就会对每对叶子进行排序和连接。然后,您可以遍历列表并找出下一对应插入的位置。递归“知道”没有关于返回递归树的信息,而是分类和连接的行为具有这种效果。
答案 2 :(得分:0)
如果你在谈论奇数子列表,那么它取决于实现。
它要么每次都将较大的子列表放在左侧,要么每次都将它放在右侧。