歸併排序求逆序對

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章