1.概述
采用分治策略,将问题分为一些小的问题然后递归求解,而治的阶段则是将分的阶段解得各个答案合并在一起。现将一个序列分为只有1,2元素的子序列,然后两两合并。
2.实现
对一个具有N个元素的数组进行归并排序
void Merge_sort(int A[],int N)
{
int *dstArray;
dstArray=(int*)malloc(N*sizeof(int));
if(dstArray!=NULL)
{
Msort(A,dstArray,0,N-1);
free(dstArray);
}
else
printf("no space!");
}
将问题分为很多小的问题递归求解,注意边界条件
void Msort(int A[],int dstArray[],int left,int right)
{
int center;
if(left<right)
{
center=(left+right)/2;
Msort(A,dstArray,left,center);
Msort(A,dstArray,center+1,right);
Merge(A,dstArray,left,center+1,right);
}
}
lpos表示是左半部分的开始,rpos表示右半部分的开始,rend表示右半部分的结束,最后的结果还是存在A里面,dstArray只是临时使用。
void Merge(int A[],int dstArray[],int lpos,int rpos,int rend)
{
int lend=rpos-1;
int num=rend-lpos+1;
int tmpos=lpos;
while(lpos<=lend&&rpos<=rend)
if(A[lpos]<=A[rpos])
dstArray[tmpos++]=A[lpos++];
else
dstArray[tmpos++]=A[rpos++];
while(lpos<=lend)//右半部分先读完
dstArray[tmpos++]=A[lpos++];
while(rpos<=rend)//左半部分先读完
dstArray[tmpos++]=A[rpos++];
//不能用lpos来遍历,因为lpos已经变化了
for(int i=0;i<num;i++,rend--)
A[rend]=dstArray[rend];
}
3.分析
运行时间是:Time=O(NlgN),因为有数组的拷贝,所以占用内存。