归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序适用于子序列有序的数据排序。
1、原理
归并排序是分治法的典型应用。分治法(Divide-and-Conquer):将原问题划分成 n 个规模较小而结构与原问题相似的子问题;递归地解决这些问题,然后再合并其结果,就得到原问题的解。从上图看分解后的数列很像一个二叉树。
归并排序采用分而治之的原理:
将一个序列从中间位置分成两个序列;
在将这两个子序列按照第一步继续二分下去;
直到所有子序列的长度都为1,也就是不可以再二分截止。这时候再两两合并成一个有序序列即可。
def merge_sort(arr):
2 """归并排序"""
3 if len(arr) == 1:
4 return arr
5 # 使用二分法将数列分两个
6 mid = len(arr) // 2
7 left = arr[:mid]
8 right = arr[mid:]
9 # 使用递归运算
10 return marge(merge_sort(left), merge_sort(right))
11
12
13 def marge(left, right):
14 """排序合并两个数列"""
15 result = []
16 # 两个数列都有值
17 while left and right:
18 # 左右两个数列第一个最小放前面
19 if left[0] <= right[0]:
20 result.append(left.pop(0))
21 else:
22 result.append(right.pop(0))
23 # 只有一个数列中还有值,直接添加
24 result += left
25 result += right
26 return result
27
28 merge_sort([11, 99, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22])
29
30 # 返回结果[11, 11, 22, 33, 33, 36, 39, 44, 55, 66, 69, 77, 88, 99]