歸併 求逆序數

2021-08-24 20:17:34 字數 865 閱讀 1418

考慮1,2,…,n (n <= 100000)的排列i1,i2,…,in,如果其中存在j,k,滿足 j < k 且 ij > ik, 那麼就稱(ij,ik)是這個排列的乙個逆序。 

乙個排列含有逆序的個數稱為這個排列的逆序數。例如排列 263451 含有8個 逆序(2,1),(6,3),(6,4),(6,5),(6,1),(3,1),(4,1),(5,1),因此該排列的逆 序數就是8。 

現給定1,2,…,n的乙個排列,求它的逆序數

分治(歸併)做到o(nlogn): 

1) 將陣列分成兩半,分別求出左半邊的逆序數和右半邊的逆序數 

2) 再算有多少逆序是由左半邊取乙個數和右半邊取乙個數構成(要求o(n)實 現) 

2的關鍵:左半邊和右半邊都是排好序的。比如,都是從大到小排序的。這 樣,左右半邊只需要從頭到尾各掃一遍,就可以找出由兩邊各取乙個數構成的 逆序個數 

#include #include #include using namespace std;

const int n = 1005;

int a[n],tmp[n];

int ans;

void merge(int l,int m,int r)

else tmp[k++] = a[i++];

}while(i <= m) tmp[k++] = a[i++];

while(j <= r) tmp[k++] = a[j++];

for(int i=l;i<=r;i++)

a[i] = tmp[i];}

void merge_sort(int l,int r)}

int main()

return 0;

}

求逆序數 逆序數 歸併排序

求排列的逆序數 分治 一 題目描述 總時間限制 1000ms 記憶體限制 65536kb 描述 在internet上的搜尋引擎經常需要對資訊進行比較,比如可以通過某個人對一些事物的排名來估計他 或她 對各種不同資訊的興趣,從而實現個性化的服務。對於不同的排名結果可以用逆序來評價它們之間的差異。考慮1...

歸併法求逆序數

求逆序數 時間限制 2000 ms 記憶體限制 65535 kb 難度 5 描述 在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。現在,給你乙個n個元素的序列,請你判斷出它的逆序數是多少。比如 1 3 2 ...

歸併排序 求逆序數

首先需要了解逆序對的概念 如果在乙個序列 數列中,滿足 則ax和ay稱為一對逆序對。現在考慮乙個問題 對乙個大小為n 即有n個元素 元素隨機無序且唯一的整數序列中,平均有多少個逆序對?乙個構造證明的方法如下 設乙個隨機無序且元素唯一的整數序列為 我們令lr為l的反向序列,即 然後在lr中任取兩個數,...