逆序對 (歸併排序)

2021-07-04 05:58:51 字數 585 閱讀 7907

逆序對的nlogn方法,改進後的歸併排序

給定排列p,求排列的逆序對數量。

p的長度<=100000。

要求o(nlogn)

定義歸併排序過程merge(l,r)

merge(l,r)

merge(l,mid)

merge(mid+1,r)

count(l,mid,mid+1,r)

只需要考慮左右兩段之間造成的逆序對,段內的逆序對由遞迴解決

#include #include #include using namespace std;

int a[8] = ;

int c[8] = ;

int count(int al, int ar, int bl, int br)

else

}if (al+i > ar && bl+j <= br)

}if (al+i <= ar && bl+j > br)

}while(al<=br)

return re;

}int mergesort(int l, int r)

#define rep(i,n) for(int i=0;i

歸併排序 逆序對

按照劉汝佳說的,歸併排序分三步 1.劃分問題,即把序列分成元素盡量相等的兩半 2.遞迴求解 3.合併子問題 其實就是把乙個序列不斷的二分,直到只有兩個元素的時候,然後排序,然後返回,再排序。先上 include using namespace std long long a 100005 t 100...

歸併排序(逆序對)

現在我們在競賽中最常用的排序是快速排序,c 只要乙個sort就搞定,但非常明顯,歸併排序的時間複雜度是最優的而且非常穩定,但是人們經常把它用在求逆序對個數上面。那麼下面我用乙個這樣的題來講一下歸併排序。點這裡看題目和樹狀陣列解法。歸併排序是將數列a l,h 分成兩半a l,mid 和a mid 1,...

逆序對 歸併排序

7 7 逆序對 20 分 對於乙個包含n個非負整數的陣列a 1.n 如果有i j,且a i a j 則稱 i j 為陣列a中的乙個逆序對。例如,陣列 3,1,4,5,2 的逆序對有 3,1 3,2 4,2 5,2 共4個。輸入包含若干組資料,第一行為乙個整數t 0對輸入中的每組測試資料,輸出一行對應...