給定乙個長度為n的整數數列,請你計算數列中的逆序對的數量。
逆序對的定義如下:對於數列的第 i 個和第 j 個元素,如果滿足 i < j 且 a[i] > a[j],則其為乙個逆序對;否則不是。
輸入格式
第一行包含整數n,表示數列的長度。
第二行包含 n 個整數,表示整個數列。
輸出格式
輸出乙個整數,表示逆序對的個數。
資料範圍
1≤n≤1000001≤n≤100000
輸入樣例:
6
2 3 4 5 6 1
輸出樣例:
5
歸併: 分治, 先分後合
分的時候(進入遞迴)是 未排好順序的,合的時候(遞迴返回)是排好順序的倆合的。
如:a 1 4 5 6 7
i mid
b 2 3 8 9
j和後c 1 2 3 4 5 6 7 8 9
在合併的過程中求逆序數
a,b 合的時候 表示a,b的內部已經排序好了,所以a b的內部的當前的逆序數總和為0,但是合併的過程中,要比較a和b中的數,如果出現圖上的情況 j的值為2,i的值為4,則a中從i到最後mid 的值都是比j的值要大的,所以2的逆序數為mid-i+1
#include#include#include#includeusing namespace std;
const int maxn=10010;
const int n=1e5+10;
int q[n],tmp[n];
long long cnt=0;
void merge_sort(int q,int l,int r) }
while(i<=mid) tmp[k++]=q[i++];
while(j<=r) tmp[k++]=q[j++];
for(i=l,j=0;i<=r;i++,j++) q[i]=tmp[j];
}int main()
歸併排序求逆序對數
參考部落格 歸併排序求逆序對數 include include include includeusing namespace std 歸併排序是借助乙個輔助陣列來進行排序 int ans 0 void merge sort int a,int l,int r,int t a是原陣列,t是輔助陣列 i...
求逆序對數總結 歸併排序
用歸併排序方式 最原始的方法的複雜度是o n 2 使用歸併排序的方式,可以把複雜度降低到o nlgn 設a 1.n 是乙個包含n個非負整數的陣列。如果在i j的情況下,有a a j 則 i,j 就稱為a中的乙個逆序對。例如,陣列 3,1,4,5,2 的 逆序對 有 3,1 3,2 4,2 5,2 共...
演算法1 求逆序對數與顯著逆序對數(歸併排序)
求逆序對數問題是歸併排序的基礎問題,顯著逆序對數則是逆序對數的公升級版。poj2299,poj1804均是此類問題 但是個別細節不同,例如poj2299需要將逆序對數變數num設為long long int型 一 求逆序對數 描述 對於乙個長度為n的整數序列a,滿足i j 且 ai aj的數對 i,...