算法步骤
运用分治思想,将规模较大的问题分成规模较小的问题,即分而治之。归并排序一共两步,第一步为无序向量的递归分解,第二步为有序向量的逐层合并。分解阶段可以理解为就是递归拆分子序列的过程,递归深度为log2n;合并阶段则保持元素顺序的同时将上一步得到的子序列集成到一起。
性能分析
- 稳定排序,不会破坏相同元素的相对位置
- 时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn),空间复杂度为 O ( n ) O(n) O(n)。(注:归并排序存在就地版本,即空间复杂度为 O ( 1 ) O(1) O(1),但时间复杂度较差)
代码实现
# Recursively implementation of Merge Sort
def merge(left, right):
result = []
while left and right:
if left[0] <= right[0]:
result.append(left.pop(0))
else:
result.append(right.pop(0))
if left:
result += left
if right:
result += right
return result
def merge_sort(L):
if len(L) <= 1:
# When D&C to 1 element, just return it
return L
mid = len(L) // 2
left = L[:mid]
right = L[mid:]
left = merge_sort(left)
right = merge_sort(right)
# conquer sub-problem recursively
return merge(left, right)
# return the answer of sub-problem
参考
代码:https://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F.