//分治排序
//分解:将n个元素分解成n/2个子序列
//解决:用合并排序法递归的排序个子序列
//合并:合并两个已排序好的子序列
//本人水平有限,此代码指供参考,如有错误请赐教,我会及时更新文章。
#include <iostream>
using namespace std;
const int num=16;
//合并已经排序好的数据,
void merge(int *p,int n1,int n2,int n3)//1 1 2 //0 2 4
{
//当合并数据下标为1,1,2是,要合并的数据元素为第一个和第二个。
int len=(n2==n1)?1:((n3-n1+1)/2);
int *A=new int[len];
int *B=new int[len];
for (int z=0;z<len;z++)
{
A[z]=p[n1+z-1];//A,B保存临时要合并的数据
B[z]=p[n2+z];
}
int i=0,j=0;
int n11=n1-1;
if (n1<=n2&&n2<n3)
{
//取出A,B中小的元素写到p
while (i!=len&&j!=len)
{
if (A[i]>B[j])
{
p[n11++]=B[j++];
}
else if (A[i]<B[j])
{
p[n11++]=A[i++];
}
else
{
p[n11++]=A[i++];
p[n11++]=B[j++];
}
if (i==len&&j!=len)
{
while (j!=len)
{
p[n11++]=B[j++];
}
}
if (j==len&&i!=len)
{
while (i!=len)
{
p[n11++]=A[i++];
}
}
}
}
}
//递归分解子序列
void merge_sort(int *p,int first,int last)
{
if (last>first)
{
int temp=(first+last)/2;
merge_sort(p,first,temp);
merge_sort(p,temp+1,last);
merge(p,first,temp,last);
}
}
void main()
{
int iData[num]={9,1,13,5,2,8,10,7,15,6,11,12,16,4,14,3};
std::cout<<"原数据为: ";
for (int i=0;i<sizeof(iData)/4;i++)
{
std::cout<<iData[i]<<" ";
}
merge_sort(iData,1,sizeof(iData)/4);
std::cout<<endl<<"排序后数据为: ";
for (int j=0;j<sizeof(iData)/sizeof(int);j++)
{
std::cout<<iData[j]<<" ";
}
std::cout<<endl;
}