合并排序,递归部分

Merge sort, the recursion part

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

我得到什么:

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汤姆


一旦列表只包含一个元素,那么每对叶都将被排序和联接。然后您可以遍历列表,找出下一对应该插入到哪里。递归对于返回递归树"一无所知",相反,它是排序和连接的行为,具有这种效果。


"递归"当然不知道这种情况。它是使用递归的代码,看起来像这样(有点简化):

1
2
3
sort list = merge (sort left_half) (sort right_half)
    where
         (left_half, right_half) = split list

在这里,您可以看到"递归"(即sort的递归调用)不需要"知道"任何东西。他们唯一的工作就是传递一个排序的列表、数组或其他东西。

换言之:如果我们的merge满足以下不变量:

1
1. `merge`, given two sorted lists, will return a sorted list.

然后我们可以像上面概述的那样轻松地编写mergesort。剩下要做的是处理简单的情况:空列表、单例和包含两个元素的列表。


如果您谈论的是奇数子列表,那么它取决于实现。

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