分治法求逆序對數目

2021-06-29 10:04:05 字數 1265 閱讀 2476

設a[1..n]是乙個包含n個不同整數的陣列。如果在ia[j],則(i,j)就稱為a中的乙個逆序對(inversion)。

給出乙個演算法,確定n個元素的任何排列中逆序對的書目。時間複雜度為o(nlgn)。

分治法求解思路:

分解:將陣列a[1..n]分為兩個子串行a[1..p]和a[p+1,n],二分法將其分解。。

解決:根據歸併排序的思想,在合併過程中,計算逆序對。假如兩個子串行為x=和y=,則xy的逆序對為x中元素大於y中元素的數目。

合併:對兩個子串行a[1..p]和a[p+1,n]合併後的序列求逆序對數目。

原陣列的逆序對數目等於兩個子串行逆序對數目之和再加上這兩個子串行合併後的逆序對數目。

歸併排序不熟悉可以看我的部落格

#include#include#include//int num =0;

void merge(int in, int out, int l, int m, int r,int &num)

else

}while (l <= m)

while (k <= r) }/*

* @brief 遞迴將序列劃分為只有乙個元素的子串行, 然後逐次對子序列進行合併

*/void m_sort(int in, int out, int l, int r,int &num)

/* 計算 l 和 r 的中間值, 防止溢位 */

int m = (l & r) + ((l ^ r) >> 1);

m_sort(out, in, l, m,num);

m_sort(out, in, m + 1, r,num);

merge(in, out, l, m, r,num);}/*

* @brief merge sort

* 統一申請空間, 避免反覆申請釋放

*/int merge_sort(int a, int n,int &num)

return -1;

}int main()

; merge_sort(a,9,sum);

for(int i=0;i<9;i++)

printf("%d ",a[i]);

printf("\n");

printf("逆序對的數目為sum=%d",sum);

printf("\n");

return 0;

}

求逆序對數目

設計乙個平均時間為o n logn o nlogn o nlog n 的演算法,在n 1 n 1000 n 1 n 1000 n 1 n 1 000 個元素的陣列中尋找逆序對數目 這裡介紹分治的思想,用歸併對陣列進行排序,在排序的過程中,即可順便將逆序對數目求出來 首先,不斷地二分這個陣列,直到最小...

求逆序對數目

題目描述 給定乙個序列 a1,a2,a na 1,a 2,a n a1 a2 an 如果存在 a i aj a i a j ai aj 且 i i j 那麼我們稱之為逆序對的,求逆序對的數目。輸入第一行為 n nn,表示序列長度,接下來的 n nn 行,第 i 1 i 1i 1 行表示序列中的第 i...

分治演算法 求逆序對數

在internet上的搜尋引擎經常需要對資訊進行比較,比如可以通過某個人對一些事物的排名來估計他對各種不同資訊的興趣,從而實現個性化服務。對於不同的排名結果可以用逆序來評價他們之間的差異。考慮1,2,n的排列i1,i2,in,如果其中存在ij,ik使得jik,那麼就稱ij,ik是這個排列的乙個逆序。...