归并排序用的是分治法,把一个大问题化解为k个中问题,每个中问题再化解为k个小问题,直至问题化为最小可解的问题。对这些问题求解,再不断地合并结果,直至合并完毕。
排序的流程可以参考下图:
完全按照《算法导论》的算法流程写的,其实利用Python的语言特性还有更简便的写法,改天贴上来。
# -*- coding: utf-8 -*-
"""Created on Wed Feb 8 23:01:27 2017@author: liuzimu"""
#自定义merge函数
def merge(L,R):
n = len(L) + len(R)
L.append(float("inf"))
R.append(float("inf"))
i = 0
j = 0
A = []
for k in range(0,n):
if L[i]<=R[j]:
A.append(L[i])
i = i+1
else:
A.append(R[j])
j = j+1
return A
merge([1,5,6],[2,3])
#自定义merge_sort函数
def merge_sort(A):
l = len(A)
if l<=1:
return A
else:
mid = l//2
print(mid)
left = merge_sort(A[0:mid])
right = merge_sort(A[mid:])
return merge(left,right)
#测试merge_sort函数
merge_sort([3,2,1,0,5,8,7,2,-5,9,6,11])
根据Python语言的特性,重新编写了归并排序的算法,看上去更加简洁
def merge(left, right):
res = []
while left and right:
min_val = left.pop(0) if left[0] < right[0] else right.pop(0)
res.append(min_val)
res += left if left else right
return res
def merge_sort(A):
if len(A) <= 1:
res = A
else:
mid = len(A) // 2
left, right = merge_sort(A[:mid]), merge_sort(A[mid:])
res = merge(left, right)
return res