排序算法之归并排序
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