分而治之: 归并排序
分而治之:一般步骤
- 分解原问题 原问题分解成多个子问题
- 解决子问题 递归地求解各个子问题
- 合并问题解 将结果合并为原问题解
归并排序
基本思想:
将两个或两个以上的有序子序“归并”为一个有序序列。在内部排序中,通常采用的是2-路归并排序。即:将两个位置相邻的记录有序子序列。
算法流程:
-
将数组
A[1,n]
排序问题分解为A[1,n/2]
和A[n/2 +1,n]
排序问题 -
递归解决子问题得到两个有序的子数组
-
将两个有序子数组合并为一个有序数组
归并排序:分解数组,递归求解,合并排序
程序如下(从小到大):
void merge_sort(int *A, int L, int R, int *T){
if(R-L > 1){
int M = L + (R-L)/2; //划分
int l = L, m = M, i = L;
merge_sort(A, L, M, T);