演算法1 求逆序對數與顯著逆序對數(歸併排序)

2021-07-25 21:30:07 字數 1991 閱讀 1411

求逆序對數問題是歸併排序的基礎問題,顯著逆序對數則是逆序對數的公升級版。poj2299,poj1804均是此類問題(但是個別細節不同,例如poj2299需要將逆序對數變數num設為long long int型)。

一、求逆序對數

描述

對於乙個長度為n的整數序列a,滿足i < j 且 ai > aj的數對(i,j)稱為整數序列a的乙個逆序。請求出整數序列a的所有逆序對個數

輸入輸入包含多組測試資料,每組測試資料有兩行

第一行為整數n(1 <= n <= 20000),當輸入0時結束

第二行為n個整數,表示長為n的整數序列

輸出每組資料對應一行,輸出逆序對的個數

樣例輸入5

1 2 3 4 5

55 4 3 2 111

0樣例輸出0

100解體思路歸併排序,大家看**自行理解吧。

**

#include#includeusing namespace std;

int n, a[20010], temp[20010], num;

void merge(int begin, int mid, int end)

else

}while (i <= mid)

while (j <= end)

for (int p = begin; p <= end; p++)

a[p] = temp[p];

}void mergesort(int begin, int end)

int main()

return 0;

}

二、求顯著逆序對數

描述

對於乙個長度為n的整數序列a,滿足i < j 且 ai > 2 * aj的數對(i,j)稱為整數序列a的乙個顯著逆序。請求出整數序列a的所有顯著逆序對個數

輸入輸入包含多組測試資料,每組測試資料有兩行

第一行為整數n(1 <= n <= 20000),當輸入0時結束

第二行為n個整數,表示長為n的整數序列

輸出每組資料對應一行,輸出顯著逆序對的個數

樣例輸入5

1 2 3 4 5

55 4 3 2 1

612 10 8 6 4 2

0樣例輸出046

解體思路

與求逆序對數不同,由於ai > 2 * aj,因此需要將排序和計數分別操作。也就是先做count,再做merge。

**

#include#includeusing namespace std;

int n, a[20010], temp[20010], num;

void mcount(int begin, int mid, int end)

else

i++; }}

void merge(int begin, int mid, int end)

else

}while (i <= mid)

while (j <= end)

for (int p = begin; p <= end; p++)

a[p] = temp[p];

}void mergesort(int begin, int end)

int main()

return 0;

}

分治演算法 求逆序對數

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

求逆序對數目

設計乙個平均時間為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...