如果用最hick的方法去求那麼就是o(n^2)的複雜度,如果想優化的話,用歸併排序的方法分治處理。
主要思想:總逆序=左邊逆序+右邊逆序+左邊右邊分別排序後的逆序
#include#includeusing namespace std;
//用歸併排序的思想來求,歸併排序為o(nlogn)的時間複雜度,比暴力的o(n^2)會好。
int merge(int *a, int low, int mid, int high)
return count;
}int main(void)
; int a = ;
int n = sizeof(a)/sizeof(a[0]);
printf("原陣列為 :\n");
for(int i=0; i
求逆序對個數(分治)
求逆序對個數 在歸併排序 從大到小 的合併過程前,對兩個分支進行逆序對數的計算 該計算過程為o n include include include define n 100005 using namespace std int a n b n void merge int a,int s,int m...
分治法求逆序對
逆序對是這樣定義的 對於給定的一段正整數序列,逆序對就是序列中ai aj且i對於這個問題,很容易能想到n 2的演算法,但是顯然很多時候這個複雜度太高了,我們今天談談nlogn的演算法。對於求逆序對,有很多種nlogn的演算法,其中一種就是分治法。其實,分治法求逆序對的演算法就是歸併排序的思想 假設我...
分治演算法 求逆序對
題目 給定乙個序列a1,a2,an,如果存在iaj,那麼我們稱之為逆序對,求逆序對的數目。解析 這道題 只要雙重迴圈就可以解決 但是因為題目要求 所以被迫使用更麻煩的方法 這道題其實就是歸併排序 至於為何 就不說了 歸併排序 就是將乙個陣列 不斷分割 一直分割到只剩乙個為止 乙個的話 必定是有序的 ...