2018lzn

归并排序之python

想更好的了解归并排序, 需先了解, 将两个有序列表, 组成一个有序列表

有两个列表  l1 = [1, 3, 5, 7]

                 l2 = [2, 4, 6]

 需要将 l1 和 l2 组成一个 有序大列表  l = [1, 2, 3, 4, 5, 6, 7]

  注意,前提 l1 和 l2 两个列表已经排好序, 是有序列表

 1 def merge(l1, l2):
 2     # 两个列表, 两个初始索引号, 赋值 0
 3     l1_index, l2_index = 0, 0
 4     # 存放结果的新的空列表
 5     result = []
 6     # 循环, 两个索引值都要小于各自列表的长度
 7     while l1_index < len(l1) and l2_index < len(l2):
 8         # 小的数值,则添加到结果列表中, 并把小列表 的索引+1,
 9         # 这样 小列表就指向下一个数据, 和 另一个列表的的数值再次比较
10         if l1[l1_index] < l2[l2_index]:
11             result.append(l1[l1_index])
12             l1_index += 1
13         else:
14             result.append(l2[l2_index])
15             l2_index += 1
16 
17     # l1 和 l2 长度可能相等, 也可能不等
18     # 但是经过while循环后, l1_index 和 l2_index 
19     # 最少有一个,已经到列表的末尾
20     # 所以,如下对两个列表的最后切片取值,
21     # 最少有一个是空列表, 
22     # 直接列表相加, 就省去了判断代码逻辑
23     result += l1[l1_index:]
24     result += l2[l2_index:]
25     return result
26 
27 
28 print(merge([1, 3, 5, 7], [2, 4, 6]))

归并排序的递归算法实现, 

直接使用了上面代码的合并 merge 函数

 1 def mergesort(lists):
 2     # 如果列表长度小于等于1
 3     # 说明列表是空列表, 或只有一个元组
 4     # 则不需要排序,直接返回原列表
 5     if len(lists) <= 1:
 6         return lists
 7     # 列表长度除以2
 8     num = int(len(lists) / 2)
 9     # 将列表一分为二,
10     # 再分别对这两个列表进行归并排序
11     left = mergesort(lists[:num])
12     right = mergesort(lists[num:])
13     # 注意,这是递归算法
14     # left 和 right 变成只有一个元素的列表值的时候
15     # 或者, left 和 right 都已是有序列表
16     # 调用merge函数
17     # 可以打印, left 和 right 的值看看,
18     # 感受, left 和 right 的变化
19     # print(left, right)
20     return merge(left, right)
21 
22 
23 print(mergesort([3, 1, 4]))
24 print(mergesort([3, 1, 4, 2]))

 

归并排序,  将一个列表 一分为二, 分别对两个新列表进行归并排序, 然后 将这 两个排序后的新列表 进行 合并.

两个被拆分的  新列表 再次进行归并排序, 直至递归到只有一个元素的情况,

最后, 由最后的两个元素, 开始 合并, 逐层 向上 合并, 实现全部排序

 

痛点: 是对递归算法的了解

 

  

 

posted on 2018-09-01 10:39  2018lzn  阅读(392)  评论(0编辑  收藏  举报

导航