二路歸併排序(過程中求逆序對)

2021-09-25 05:43:16 字數 748 閱讀 1410

給定乙個1-n的排列a1, a2, ... an,如果ai和aj滿足i < j且ai > aj,我們就稱(ai, aj)是乙個逆序對。  

求a1, a2 ... an中所有逆序對的數目。  

input

第一行包含乙個整數n。  

第二行包含n個兩兩不同整數a1, a2, ... an。(1 <= ai <= n)  

對於60%的資料 1 <= n <= 1000  

對於100%的資料 1 <= n <= 100000

output

乙個整數代表答案

sample input

5

3 2 4 5 1

sample output

5
#include

using namespace std;

const long n = 100000;

long a[n],tmp[n];

long flag;

void merge(long l,long m,long r)

else tmp[k++] = a[i++];

}while(i <= m) tmp[k++] = a[i++];

while(j <= r) tmp[k++] = a[j++];

for(long i=l;i<=r;i++) a[i] = tmp[i];

}void merge_sort(long l,long r)

}int main()

歸併排序(二路歸併)

歸併排序是一種遞迴思想的體現,通過多次合併較小的幾個 二路歸併為兩個 有序陣列形成新的有序表。思路 將陣列分為n nn個一元組,兩兩合併得到二元組,以此類推共合併log 2n log 2n log2 n 次後,陣列變得有序。時間複雜度為o n logn o nlogn o nlog n 編譯環境de...

二路歸併排序

不是困難的演算法,不過也是練習了下遞迴。include include include using namespace std const int maxn 100 5 int a maxn int b maxn void mergesort int a,int b,int begin,int en...

二路歸併排序

二路歸併排序是將兩個有序表合併成乙個有序表的排序方法。其基本思想為 序列中有 n個記錄,可以看作為 n個有序子串行,每個序列長度為 1。首先將每相鄰的兩個記錄合併,得到 n 2 個較大的有序子串行,每個序列長度為 2。再將上述子串行兩兩合併,得到 n 2 2 個有序子串行,直至得到乙個長度為 n的有...