分治法求逆序對

2021-07-30 12:44:50 字數 1183 閱讀 8479

逆序對是這樣定義的:對於給定的一段正整數序列,逆序對就是序列中ai>aj且i對於這個問題,很容易能想到n^2的演算法,但是顯然很多時候這個複雜度太高了,我們今天談談nlogn的演算法。

對於求逆序對,有很多種nlogn的演算法,其中一種就是分治法。

其實,分治法求逆序對的演算法就是歸併排序的思想

假設我們要統計數列a中的逆序對的個數,我們可以先將數列a從中間分成兩半得到陣列b和c

於是我們有3種情況的逆序對

第一種:i,j都在數列b

第二種:i,j都在數列c

第三種:i在b, j在c

對於第一種和第二種,我們可以通過遞迴求得,而對於第三種,我們可以在有序的b、c數列基礎上直接計算得到

**奉上:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define tmax(a, b) if (b > a) a = b

#define tmin(a, b) if (b < a) a = b

char inc()

int ini()

long long inll()

double ind()

string ins()

int inl(char _)

typedef pairpii;

typedef pairpcc;

typedef long long ll;

const int inf = 0x3f3f3f3f;

const ll lnf = 0x3f3f3f3f3f3f3f3f;

const double pi = 3.14159265358979323846;

const double eps = 1e-8;

const int mod = 100007;

const int maxn = 500 * 100 + 10;

int count(vector&a) else

}return res;

}int main()

分治法求逆序數

include include include include using namespace std int arr2 100 在對序列進行二路歸併排序的時候,要將序列拆分成若干子串行,先將子串行排序,再合併子串行構成最終排序後的序列。二路歸併演算法還有乙個特點,在進行歸併操作時候的兩個子串行是有...

分治演算法 求逆序對

題目 給定乙個序列a1,a2,an,如果存在iaj,那麼我們稱之為逆序對,求逆序對的數目。解析 這道題 只要雙重迴圈就可以解決 但是因為題目要求 所以被迫使用更麻煩的方法 這道題其實就是歸併排序 至於為何 就不說了 歸併排序 就是將乙個陣列 不斷分割 一直分割到只剩乙個為止 乙個的話 必定是有序的 ...

分治法求逆序對數目

設a 1.n 是乙個包含n個不同整數的陣列。如果在ia j 則 i,j 就稱為a中的乙個逆序對 inversion 給出乙個演算法,確定n個元素的任何排列中逆序對的書目。時間複雜度為o nlgn 分治法求解思路 分解 將陣列a 1.n 分為兩個子串行a 1.p 和a p 1,n 二分法將其分解。解決...