挑战二--第七章高等排序(一)

觉得这一部分还是比较基础比较重要所以看完了还耽搁了两天才返回来写一下总结的博客。。。(其实是又懒有嫌麻烦再加上打了(挂机)两场比赛 ,做题体验很差,就很影响心情。因为我又不知道我现在做的这些是不是又是“无用功”了....)


7.1归并排序 

伪代码

meger (A,l,r,m)
	n1=m-l
	n2=r-m
	L[0...n1],R[0...n2]
	for i=0 to n1-1
		L[i]=A[l+i]
	for i=0 to n2-1
		R[i]=A[m+i]
	L[n1]=INFTY
	R[n2]=INFTY
	
	i=0,j=0
	for k=l to r-1
		if L[i] <= R[j]
			A[k]=L[i++]
			
		else 
			A[k]=R[j++]

M_sort(A,l,r)
	if l+1<r
		mid=(l+r)/2
		M_sort(A,l,m)
		M_sort(A,m,r)
		merge(A,l,m,r)

书上的讲解还是太麻烦了,简单一点来讲(自己认为的并不知道正确与否)emm,归并排序就是先将体积庞大的无序的数组平均拆成两个有序的数组,然后两个数组再分别继续拆成两个有序数组直至最小的数组中只有一个元素。然后将已经排序好的有序数组合并“整合”起来成为一个数组。(这就是传说中的递归思想?)


实现代码:

ll merge(ll a[],ll l,ll r,ll m){
	ll n1=m-l;
	ll n2=r-m;
	for(ll i=0;i<n1;i++)	L[i]=a[l+i];
	for(ll i=0;i<n2;i++)	R[i]=a[m+i];
	L[n1]=INF; R[n2]=INF;
	ll i=0,j=0;
	
	for(ll k=l;k<r;k++){
		ans++;
		if(L[i]<=R[j]){
			a[k]=L[i++];
		}
		else {
			a[k]=R[j++];
			
		}
	}
	return ans;
}
void msort(ll a[],ll l,ll r){
	if(l+1<r){
		ll m=(l+r)/2;
		msort(a,l,m);
		msort(a,m,r);
		merge(a,l,r,m);
	}
	return ;
}


归并排序的时间复杂度为O(nlogn) 高效且稳定


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值