分治法的精髓:
分--将问题分解为规模更小的子问题;
治--将这些规模更小的子问题逐个击破;
合--将已解决的子问题合并,最终得出“母”问题的解;
分治模式每一层递归的三个步骤:
分解(Divide):将原问题分解成一系列子问题;
解决(Conquer):递归的解各个子问题。若子问题足够小,直接求解;
合并(Combine):将子问题的结果合并成原问题的解。
算法C++实现:
#include
#include
//#include
using namespace std;
void Merge(int *A, int p, int q, int r) //合并函数
{
int n1 = q - p + 1; // A[p..q]长度
int n2 = r - q; // A[q+1..r]长度
int *L = new int[n1 + 1]; //用动态数组存储左边的数
int *R = new int[n2 + 1]; //用动态数组存储右边的数
for (int i = 1; i <= n1; i++) //把A数组左边的数放入L[]数组
{
L[i] = A[p + i - 1];
}
for (int j = 1; j <= n2; j++) //把A数组右边的数放入R[]数组
{
R[j] = A[q + j];
}
L[n1 + 1] = R[n2 + 1] = INT_MAX; //定义无穷大
int i = 1, j = 1;
for (int k = p; k <= r; k++) //小的放左边,大的放右边
{
if (L[i] <= R[j])
{
A[k] = L[i];
i = i + 1;
}
else
{
A[k] = R[j];
j = j + 1;
}
}
}
void MergeSort(int A[], int p, int r) //归并排序
{
if (p < r) // p:第0个数r:第n-1个数。数组至少两个数据
{
int q;
q = (r + p) / 2;
MergeSort(A, p, q); //第0个到第 (r + p) / 2 ,即拆分左半部分
MergeSort(A, q + 1, r);//第(r + p) / 2个到第 r ,即拆分右半部分
Merge(A, p, q, r); //调用合并函数,从第0个到第n-1个排好
}
}
int main() {
int n;
cout << "输入产生的数组个数:";
cin >> n;
cout << endl;
int *A = new int[n];
cout << "产生的随机数组为:";
srand((unsigned)time(0));
for (int i = 0; i < n; i++)
{
A[i] = (rand() % (100 - 0 + 1)) + 0;
cout << A[i] << " ";
}
cout << endl;
MergeSort(A, 0, n - 1);
cout << "排序后的数组为:";
for (int j = 0; j<n; j