分治法的设计思想是利用某些算法递归的特性,将原问题分解为n个结构相似的子问题,递归解决这些子问题,在合并其结果,便得到原问题的解,代表算法为合并排序法。
合并排序法的原理是将原序列分为两个子序列,将两个子序列分别排序后进行合并,得到一个完整的排序序列。序列分解的最终结果是含有一个元素,单个元素即可视为已排序序列。合并排序的关键步骤是两个已排序序列的合并,其代码如下。
#include <iostream>
using namespace std;
void merge(int *a,int p,int r,int q)
{
int n1=r-p+1;
int n2=q-r;
int *in1=new int[n1];
int *in2=new int[n2];
for(int i=0;i<n1;++i)
{
in1[i]=a[i+p];
}
for(int i=0;i<n2;++i)
{
in2[i]=a[i+r+1];
}
int j=0,k=0;
for(int i=0;i<n1+n2;++i)
{
if(j>=n1)
{
a[i+p]=in2[k];
k++;
}
else if(k>=n2)
{
a[i+p]=in1[j];
j++;
}
else
{
if(in1[j]<in2[k])
{
a[i+p]=in1[j];
j++;
}
else
{
a[i+p]=in2[k];
k++;
}
}
}
}
void merge_sort(int *a,int p,int q)
{
if(p<q)
{
int r=(p+q)/2;
merge_sort(a,p,r);
merge_sort(a,r+1,q);
merge(a,p,r,q);
}
}
int main()
{
cout<<"please input 10 numbers:"<<endl;
int a[10];
for(int i=0;i<10;++i)
{
cin>>a[i];
}
merge_sort(a,0,9);
for(int i=0;i<10;++i)
cout<<a[i]<<"\t";
cout<<endl;
return 1;
}