归并排序求逆序对

今天是2018.11.9,明天就是NOIP,感觉自己基本数据结构已经差不多掌握了,但是在与学长luo y b对拍板子的时候突然发现逆序对和归并排序这个盲区,花了1小时差不多补上了。为了NOIP RP ++ ,特此水一篇,供以后的OIER借鉴。(PS.也许是人生最后一篇呢...)

下面贴代码:

void msort(int s,int t)
{
	if(s==t) return;
	int mid=(s+t)>>1;
	msort(s,mid);msort(mid+1;t);
	int i=s,j=mid+1,k=s;
	while(i<=mid&&j<=t)
	{
		if(a[i]<=a[j]){r[k]=a[i];k++;i++;}
		else{r[k]=a[j];k++;j++;ans+=mid-i+1;}
	}
	while(i<=mid){r[k]=a[i];k++;i++;}
	while(j<=t){r[k]=a[j];k++;j++;}
	for(int i=s;i<=t;i++) a[i]=r[i];
}

首先三行是类似线段树的数据拆分。如果没得分了,那就return;如果有得分,就分下去。

第四行是一个定义,定义i为左区间的指针(范围:左端到正中间),j为右区间的指针(范围:正中间+1到右端),k用于记录缓存数组r。

当两个指针都还在区间内时,假如说a[i]小于a[j],缓存数组r记录a[i];当a[i]大于等于a[j]时,说明i之后一直到正中间都比a[j]要大,所以ans+=mid-i+1;其实除了这一个ans,其他就是归并排序的板子。

之后把范围之外的数放入缓存数组r。

最后一行将缓存数组赋值给原数组。

祝所有看到该博客的OIER RP ++。ღ( ´・ᴗ・` )比心

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值