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