归并排序
归并排序算是对分治算法的一种运用。
时间复杂度为O(nlogn)也是一种比较快速的排序算法
首先将代排序的数递归分化成多个小区间,那么我们可以默认,只有一个数的区间是已经排好序的
然后进行合并。
递归分化的代码:
void Mergesort(int l,int r)
{
if(l>=r)
return;
int mid=(l+r)>>1; //分治过程,当只有一个数时可以默认为已经排序的状态
Mergesort(l,mid); //已经排序好的左区间
Mergesort(mid+1,r); //已经排序好的右区间
Unite(l,mid,r); //排序加合并
}
合并的时候相当于把两个有序的数组合并
那么合并的方法就是,每次取最小的两个比较,
小的那个记录下来,并且删去,继续比较
代码:
void Unite(int l,int mid,int r) //合并[l,mid],[mid+1,r];
{
int tmp[20],t=0;
int ll=l,rl=mid+1,mm=mid;
while(ll<=mm&&rl<=r) //两段取最小的比较,小的输出并删去
{
if(m[ll]<m[rl])
tmp[t++]=m[ll++];
else
tmp[t++]=m[rl++];
}
while(ll<=mm)
tmp[t++]=m[ll++];
while(rl<=r)
tmp[t++]=m[rl++];
for(int i=0;i<t;i++) //将排序好的赋值给区间 [l,r]
m[l+i]=tmp[i];
}