合并排序,递归部分

时间:2015-04-12 09:07:02

标签: recursion merge

在研究合并排序几天之后,我从概念上理解它,但有一件事我没有。

我得到了什么:

1。)它需要一个列表,例如一个数字数组,将它分成两半并对两个半部分进行排序,最后将它们合并在一起。

2。)因为它是递归算法,所以它使用递归来做到这一点。     因此,所提到的数组的拆分如下:

enter image description here

它,将数组拆分,直到每个列表中只有一个项目,然后将其视为已排序。在那一点上,合并步入。 这应该是这样的:

enter image description here

我没有得到的是,在将所有列表拆分为列表中的一个项目之后递归“知道”,以便重新获得递归树?左右两侧的东西在合并后如何成为左侧?

困扰我的是这件事。我从interactivepython页面获取了代码的快照 enter image description here

在我们将lefthalf = 2和righthalf = 1之后,代码如何到达图片中显示的代码,其中lefthalf = [1,2]和righthalf = [4,3]回到可以分割我们已经合并的递归?

TNX, 汤姆

3 个答案:

答案 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)

如果你在谈论奇数子列表,那么它取决于实现。

它要么每次都将较大的子列表放在左侧,要么每次都将它放在右侧。