用歸併排序演算法求逆序對數量

2021-10-02 09:18:56 字數 1030 閱讀 6861

給定乙個長度為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,...