歸併排序查詢逆序對

2021-07-07 09:31:33 字數 1029 閱讀 1917

description

let a(1), ..., a(n) be a sequence of n numbers. if ia(j), then the pair (i,j) is called an inversion pair.

the inversion number

of a sequence is one common measure of its sortedness. given the sequence a, calculate its inversion number.

input

there are multiple cases.

each case contains an integer n (n<=100,000) followed by a(1) , ..., a(n).

output

for each case, output the inversion number.

sample input

5

3 1 4 5 2

sample output

4
題目分析

根據逆序對的定義,如果暴力比較,複雜度是o(n^2)

採用歸併排序的話,可以將複雜度降到o(n*log(n))

假設左右都已經排好序,當右邊的某個數i小於了左邊的某個數j,

則i一定小於左邊部分所有大於j的數,即這些都是逆序對

這樣在最終排序完成時,可以找到所有的逆序對

由於歸併排序的複雜度為o(n*log(n))

所以總的複雜度為o(n*log(n))

#include int arr[100001];

long long count;

void sort(int start, int end) else if (index2 == len2) else else }}}

void merge(int start, int end)

}int main()

}

逆序對 (歸併排序)

逆序對的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 只需要考慮左右兩段之間造成的逆序對...

歸併排序 逆序對

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

歸併排序(逆序對)

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