一、实现思想
1.将一个问题划分为同一类型的若干子问题,子问题最好规模相同
2.对子问题求解(一般使用递归方法)
3.有必要的话,合并子问题的解,得到原始问题的答案
下图描述的是将一个问题划分为两个较小子问题的例子,也是最常见的情况:
二、分治算法之 合并排序
1.主要思想
对于一个需要排序的数组A[0…n-1],将其一分为二:A[0…n/2-1]和A[n/2…n-1] (n/2向下取整),对每个子数组递归排序,然后把这两个排好序的子数组合并为一个有序数组
Mergesort(A[0...n-1])
//递归调用Mergesort对数组A[0...n-1]进行排序
//输入:一个可排序数组A[0...n-1]
//输出:非降序排列数组A[0...n-1]
if n>1
copy A[0....n/2-1] to B[0....n/2-1]
copy A[n/2....n-1] to C[0....n/2-1]
Mergesort(B[0....n/2-1])
Mergesort(C[0....n/2-1])
Merge(B,C,A) //合并
Merge(B[0....p-1],C[0....q-1],A[0....p+q-1])
//将两个有序数组合并为一个有序数组
//输入:两个有序数组B[0....p-1]和C[0....q-1]
//输出:有序数组A[0....p+q-1]
i=0;j=0;k=0
while i<p and j<q do
if B[i]<=C[j]
A[k]=B[i]
i++
else
A[k]=C[j]
j++
k++
if i=p //这里不会出现i=p,j=q的情况
copy C[j...q-1] to A[k....p+q-1]
else
copy B[i...p-1] to A[k...p+q-1]