/*改進的做法
利用分治法,借助歸併排序求解逆序數。
時間複雜度:o(nlogn)
在歸併排序的基礎做乙個修改即可:
不是算右邊的相對左邊的逆序數,這樣太過於繁雜
而是算左邊相當於右邊的逆序數,這樣可以就在這乙個地方做統一處理
即當檢測到左邊大於右邊的時候,則所有剩下的左邊的數都相對於當前右邊的數大,所以逆序數都要加 1 。
count += (end - begin + 1); */
#include#include#include#include#includeusing namespace std;
#define n 10
int sum=0;
void merge(int a,int l,int m,int r)
else
k++;
}while(begin1<=end1||begin2<=end2)
if(begin2<=end2)
}for(int i=0;i<=(r-l);i++)
delete t;
}int merge_sort(int a, int l,int r)
return sum;
}void print(int a)
{ int i=0;
while(i
樹狀陣列求解逆序數
數列的逆序數可以使用歸併排序求解,亦可以使用樹狀陣列解決。現在獻上兩題,用樹狀陣列求解逆序數。poj 2299 ultra quicksort 大意 乙個排列經過多少次交換能夠成為排好序的結果。分析 之前用歸併排序做過,這次練習資料結構。離散 對映 樹狀陣列 例如 1 9 8 4 5 1 5 4 2...
分治遞迴逆序數 歸併演算法經典應用 求解逆序數
原創不易,求個關注 在之前介紹線性代數行列式計算公式的時候,我們曾經介紹過逆序數 我們在列舉出行列式的每一項之後,需要通過逆序數來確定這一項符號的正負性。如果有忘記的同學可以回到之前的文章當中複習一下 線性代數精華1 從行列式開始 如果忘記呢,問題也不大,這個概念比較簡單,我想大家很快就能都搞清楚。...
求逆序數(分治法求解)
題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 輸入描述 題目保證輸入的陣列中沒有的相同的數字 資料範圍 對於 50的資料,size 1...