递归算法:
void Merge(int *dataArray,int start, int p, int end)
{
int lsize=p-start,rsize=end-p;//两个数组的大小
int *l = new int[lsize], *r = new int[rsize];//要合并的两个数组
memcpy(l,dataArray+start,sizeof(int)*lsize);
memcpy(r,dataArray+p,sizeof(int)*rsize);//将要合并的数组复制
int lnow=0,rnow=0,i;//未合并的数字的位置
for(i=0;lnow<lsize&&rnow<rsize;i++)
{
if(l[lnow]<r[rnow])//取较大的数
{
dataArray[start+i]=l[lnow];
lnow++;
}
else
{
dataArray[start+i]=r[rnow];
rnow++;
}
}
if(lnow==lsize&&rnow!=rsize)//其中一个数组合并完以后,复制剩下的数据
{
memcpy(dataArray+start+i,r+rnow,sizeof(int)*(rsize-rnow));
}
else if(rnow==rsize&&lnow!=lsize)
{
memcpy(dataArray+start+i,l+lnow,sizeof(int)*(lsize-lnow));
}
delete l;
delete r;//清理内存
}
//排序函数time:O(nlgn)
void merge_sort(int* dataArray,int start,int end)
{
if(end-start>1)//当元素个数为1时直接返回
{
int p = (start + end) / 2;//切割数组
merge_sort(dataArray, start, p);
merge_sort(dataArray, p, end);//分别排序
Merge(dataArray,start, p, end);//合并数组
// print_array(dataArray, end);
}
}