求逆序對個數(分治)

2021-07-28 11:41:18 字數 633 閱讀 8556

求逆序對個數

在歸併排序(從大到小)的合併過程前,對兩個分支進行逆序對數的計算(該計算過程為o(n))

#include #include #include #define n 100005

using namespace std;

int a[n], b[n];

void merge(int a, int s, int m, int e, int tmp)

while (p1 <= m)

tmp[p++] = a[p1++];

while (p2 <= m)

tmp[p++] = a[p2++];

for (int i = 0; i < p; i++)//把結果拷貝到全域性陣列a中

a[i + s] = tmp[i];

}long long cal(int a, int s, int m, int e, int tmp)

else

j++;

} return result;

}long long merge_sort(int a, int s, int e, int tmp)

return cnt;

}int main()

分治 求逆序對個數並列印逆序對

如果用最hick的方法去求那麼就是o n 2 的複雜度,如果想優化的話,用歸併排序的方法分治處理。主要思想 總逆序 左邊逆序 右邊逆序 左邊右邊分別排序後的逆序 include includeusing namespace std 用歸併排序的思想來求,歸併排序為o nlogn 的時間複雜度,比暴力...

分治法求逆序對

逆序對是這樣定義的 對於給定的一段正整數序列,逆序對就是序列中ai aj且i對於這個問題,很容易能想到n 2的演算法,但是顯然很多時候這個複雜度太高了,我們今天談談nlogn的演算法。對於求逆序對,有很多種nlogn的演算法,其中一種就是分治法。其實,分治法求逆序對的演算法就是歸併排序的思想 假設我...

分治演算法 求逆序對

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