求逆序數(C語言) 歸併

2021-10-02 07:49:21 字數 1130 閱讀 4671

問題 a: 求逆序數

描述在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。

現在,給你乙個n個元素的序列,請你判斷出它的逆序數是多少。

比如 1 3 2 的逆序數就是1。

格式輸入格式

第一行輸入乙個整數t表示測試資料的組數(1<=t<=5)

每組測試資料的每一行是乙個整數n表示數列中共有n個元素(2〈=n〈=100000)

隨後的一行共有n個整數ai(0<=ai<1000000000),表示數列中的所有元素。

資料保證在多組測試資料中,多於10萬個數的測試資料最多只有一組。

輸出格式

輸出該數列的逆序數

樣例樣例輸入 copy22

1 13

1 3 2

樣例輸出 copy01

解析:這一題可以用歸併排序求逆序數的多少,其實就是在歸併的同時一旦遇到反序的就用mid-x+1記錄就好了,而歸併排序就是個模板一樣,記住就好了

**:

#include #include #include long long res[100000]=,count,a[100000]=; //a陣列存放原來資料,res陣列存放每次msor排好序的結果,count記錄逆序數

long long msort(long long *a,long long left,long long mid,long long right)

else

}while(x<=mid) res[k++]=a[x++];

while(y<=right) res[k++]=a[y++]; //檢測漏網的數

for(x=left;x<=right;x++)

//把每次排好的序放進原陣列

}long long merge(long long *a,long long left,long long right)

int main()

}return 0;

}

歸併要理解的話對遞迴的運作也得要清楚,簡單說就是主函式調動,merge函式劃分區域,左右慢慢分開歸併,然後msort函式排序,遞迴時的left,right,mid是很重要的傳遞引數,不僅是排序區域,也是排完序後傳值的分開區域

歸併 求逆序數

考慮1,2,n n 100000 的排列i1,i2,in,如果其中存在j,k,滿足 j k 且 ij ik,那麼就稱 ij,ik 是這個排列的乙個逆序。乙個排列含有逆序的個數稱為這個排列的逆序數。例如排列 263451 含有8個 逆序 2,1 6,3 6,4 6,5 6,1 3,1 4,1 5,1 ...

求逆序數 逆序數 歸併排序

求排列的逆序數 分治 一 題目描述 總時間限制 1000ms 記憶體限制 65536kb 描述 在internet上的搜尋引擎經常需要對資訊進行比較,比如可以通過某個人對一些事物的排名來估計他 或她 對各種不同資訊的興趣,從而實現個性化的服務。對於不同的排名結果可以用逆序來評價它們之間的差異。考慮1...

歸併法求逆序數

求逆序數 時間限制 2000 ms 記憶體限制 65535 kb 難度 5 描述 在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。現在,給你乙個n個元素的序列,請你判斷出它的逆序數是多少。比如 1 3 2 ...