到了包含递归的排序了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
def merge_sort(arg): print arg if len(arg) <=1: return arg num = int(len(arg)/2) left = merge_sort(arg[:num]) right = merge_sort(arg[num:]) return merge(left,right) def merge(left,right): l,r = 0,0 result = [] while l < len(left) and r<len(right): if left[l] < right[r]: result.append(left[l]) l +=1 else : result.append(right[r]) r +=1 result +=left[l:] result +=right[r:] return result |
代码参考:http://wuchong.me/blog/2014/02/09/algorithm-sort-summary/#comments
理解这段代码最核心的还是要绕明白递归的那个巡环,其实,举个例子就明白了,假如,我们要排序的是一个非常简单的数租
【2】
这个时候我们传递给merge_sort,这个时候len(arg)=1,直接返回了【2】
再假如我们还有一个另外一个数租
【1】,同理,也是直接返回【1】
但是,如果我们有一个数租【2,1】,我们传递给merge_sort之后,len(arg)=2,所以
left = merge_sort([2])
right = merge_sort([1])
在上面我们已经知道当数租是[1]或者【2】时候返回给我门的数值
也就是说left=[2],right=[1],这个数租是无序的,我们需要通过mere()来变成有序的,经过merge之后
我们得到的是【1,2】
假如,我们现在要比较的数组是:[4,2,1]
传递给merge_sort之后,我们得到的是
left=merge_sort([4])
right=merge_sort([2,1])
同样的,我们知道left=[4],right=[1,2]
但是,这个还是无序的,没有关系,调用merge就好了
……..
这就是递归
Latest posts by Zhiming Zhang (see all)
- aws eks node 自动化扩展工具 Karpenter - 8月 10, 2022
- ReplicationController and ReplicaSet in Kubernetes - 12月 20, 2021
- public key fingerprint - 5月 27, 2021