dangdangA

导航

排序算法之归并排序

1.归并算法思想:

 

      归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。 归并排序采用分而治之的原理:

 

       一、将一个序列从中间位置分成两个序列;

 

       二、在将这两个子序列按照第一步继续二分下去;

 

       三、直到所有子序列的长度都为1,也就是不可以再二分截止。这时候再两两合并成一个有序序列即可。

2.算法时间空间复杂度:

   每次合并操作的平均时间复杂度为O(n),而完全二叉树的深度为|log2n|。总的平均时间复杂度为O(nlogn)。而且,归并排序的最好,最坏,平均时间复杂度均为O(nlogn)

3.稳定性:稳定

 

4.python代码:

 1 #coding:utf-8
 2 #合并两个有序数列
 3 def merge(a, b):
 4     '''
 5     :param a: 数列a
 6     :param b: 数列b
 7     :return: 返回排序好的数列
 8     '''
 9     c = [] #存放排序好的元素
10     h = j = 0 #两个指针分别从头开始遍历两个数列
11     while j < len(a) and h < len(b):
12         if a[j] < b[h]:
13             c.append(a[j])
14             j += 1
15         else:
16             c.append(b[h])
17             h += 1
18     #将剩余的直接加入到列表中
19     if j == len(a):
20         for i in b[h:]:
21             c.append(i)
22     else:
23         for i in a[j:]:
24             c.append(i)
25 
26     return c
27 
28 #递归的对数列进行排序
29 def merge_sort(lists):
30     if len(lists) <= 1:
31         return lists
32     middle = len(lists)//2
33     left = merge_sort(lists[:middle])
34     right = merge_sort(lists[middle:])
35     return merge(left, right)
36 
37 
38 if __name__ == '__main__':
39     s = [6, 8, 1, 4, 3, 9, 5, 4, 11, 2, 2, 15, 6]
40     print("before sort:",s)
41     s1 = merge_sort(s)
42     print("after sort:",s1)

 

5.输出结果

 

 

6.参考原文:

https://www.cnblogs.com/chengxiao/p/6194356.html

 

posted on 2020-06-29 15:17  dangdangA  阅读(173)  评论(0编辑  收藏  举报