分治策略:
将原问题划分为n个规模较小而结构与原问题相似的的子问题,递归地解决这些子问题,然后再合并这些结果,就得到原问题的解。
分支策略在每层递归上都实现以下三个步骤:
分解:将原问题划分为多个子问题。
解决:递归地解决各个子问题。若子问题足够小,则直接求解
合并:将子问题的结果合并成原问题的解。
合并排序完全依照了上述模式:
分解:将n个元素分成各含n/2个元素的子序列
解决:用合并排序法递归的对两个子序列进行排序。
合并:合并两个一排好序的子序列以得到排序结果。
时间复杂度是O(nlgn)
C++实现代码如下:
#include<iostream>
using namespace std;
void Merge(int *a,int p,int q,int r)
{
int len1,len2;
int L[1000]={0},R[1000]={0};
len1=q-p+1;
len2=r-q;
int i,k,j;
for(i=0;i<len1;i++)
{
L[i]=a[p+i];
}
for(i=0;i<len2;i++)
{
R[i]=a[q+1+i];
}
L[len1]=1000000;
R[len2]=1000000;
i=0;j=0;
for(k=p;k<=r;k++)
{
if(L[i]<R[j])
{
a[k]=L[i];
i++;
}
else
{
a[k]=R[j];
j++;
}
}
}
void MergeSort(int *a,int p,int r)
{
if(p<r)
{
int q=(r+p)/2;
MergeSort(a,p,q);
MergeSort(a,q+1,r);
Merge(a,p,q,r);
}
}
int main()
{
int a[20]={4,6,2,3,5,1,7,9,8,10,14,16,12,13,15,11,17,19,18,110};
MergeSort(a,0,19);
for(int i=0;i<20;i++)
{
cout<<a[i]<<" ";
}
return 0;
}