Merge sort, the recursion part
在研究了几天的合并排序之后,我从概念上理解了它,但是有一件事我不能理解。
我得到什么:
1.)它获取一个列表,例如一个数字数组,将其拆分为两半并对两个半进行排序,最后将它们合并在一起。
2.)因为它是一个递归算法,所以它使用递归来实现这一点。因此,上述数组的拆分如下所示:
它将拆分数组,直到每个列表中只有一个项,并按该项进行排序。在这一点上,合并开始了。应该是这样的:
我不知道的是,在递归将所有列表拆分为一个列表中的一个项目之后,如何才能恢复递归树?有一个左右边的东西在合并后是如何变成左边的?
困扰我的是这个。我从InteractivePython页面截取了代码的快照
当我们有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 |
在这里,您可以看到"递归"(即
换言之:如果我们的
1 | 1. `merge`, given two sorted lists, will return a sorted list. |
然后我们可以像上面概述的那样轻松地编写mergesort。剩下要做的是处理简单的情况:空列表、单例和包含两个元素的列表。
如果您谈论的是奇数子列表,那么它取决于实现。
它要么每次都把较大的子列表放在左边,要么每次都把它放在右边。