归并排序

归并排序

归并排序算是对分治算法的一种运用。
时间复杂度为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];
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值