一、简介
归并排序使用分治法的思想。分治法将原问题分解为几个规模较小但类似于原问题的子问题。现在很多有用的算法结构上都是递归的,为了解决某一个问题,算法调用自身来解决紧密相关的若干子问题。
分治法每层递归时都有三个步骤:
分解:将原问题分解为若干的子问题,这些子问题都是原问题规模较小的实现。
解决:这些子问题,递归地求解各子问题。
合并:这些子问题的解成原问题的解。
二、算法简介
分解:归并排序算法,将待排序的元素序列分成各具有n/2个元素的两个子序列。
解决:使用排序递归地排序两个子序列
合并:最后合并两个已排序的子序列以产生已排序的答案。
三、算法实现
#归并排序
def merge(A, p, q, r):
L = A[p:q]
R = A[q:r]
L.append(float("inf")) #float("inf")是无穷大的意思
R.append(float("inf"))
i, j, k = 0, 0, p
length = r
print L, R
while k < r:
if L[i] <= R[j]:
A[k] = L[i]
i += 1
else:
A[k] = R[j]
j += 1
k += 1
return A
#递归调用
def merge_sort(A, p, r):
if p+1 < r:
if (p + r)%2 == 0:
q = (p + r ) / 2
else:
q = (p + r)/2 + 1
merge_sort(A, p, q)
merge_sort(A, q, r)
merge(A, p, q, r)
参考文献:
1、算法导论
2、python核心编程