今天是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 ++。ღ( ´・ᴗ・` )比心
692

被折叠的 条评论
为什么被折叠?



