首页 > 编程语言 > 详细

排序算法之归并排序

时间:2020-06-29 16:05:52      阅读:73      评论:0      收藏:0      [点我收藏+]

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

 

排序算法之归并排序

原文:https://www.cnblogs.com/xiaodangdang/p/13207791.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!