算法思想:分治法
分治法的思想:将原问题分解为几个规模小但类似于原问题的子问题,递归的求解这些子问题,然后再合并这些子问题的解来建立原问题的解。
分治模式在每层递归时都有三个步骤:分解,解决,合并。
以归并排序作为分治算法思想应用的一个列子作为分析,类似的问题还有重建二叉树:
void merge(int *A, int left, int mid, int right)
{
int*p = new int[right - left + 1];
int l = left;
int r = mid + 1;
int index = 0;
while (l <= mid&&r <= right)//处理主要是完成分解的两个小模块之间进行排序,也属于合并部分。
{
if (A[l] <= A[r])
p[index++] = A[l++];
else
p[index++] = A[r++];
}
while (l <= mid)
p[index++] = A[l++];
while (r<=right)
p[index++] = A[r++];
for (int i = 0; i <= (right - left); i++)
{
A[left + i] = p[i];
}
}
void process(int *A, int left, int right)
{
if (left == right)
return;
int mid = (left + right) / 2;
process(A, left, mid); //分解的过程;
process(A, mid + 1, right);//分解的过程
merge(A, left, mid, right);//包含处理与合并过程
}
int* mergeSort(int* A, int n)
{
if (n <= 0 || A == NULL)
return NULL;
process(A, 0, n - 1);
return A;
}