求逆序數 逆序數 歸併排序

2021-09-07 14:01:37 字數 2663 閱讀 2445

求排列的逆序數(分治)

一、題目描述

總時間限制: 

1000ms 

記憶體限制: 

65536kb 描述

在internet上的搜尋引擎經常需要對資訊進行比較,比如可以通過某個人對一些事物的排名來估計他(或她)對各種不同資訊的興趣,從而實現個性化的服務。

對於不同的排名結果可以用逆序來評價它們之間的差異。考慮1,2,…,n的排列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 構成的所有n!個排列中,最小的逆序數是0,對應的排列就是1,2,…,n;最大的逆序數是n(n-1)/2,對應的排列就是n,(n-1),…,2,1。逆序數越大的排列與原始排列的差異度就越大。

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

第一行是乙個整數n,表示該排列有n個數(n <= 100000)。

第二行是n個不同的正整數,之間以空格隔開,表示該排列。 輸出

輸出該排列的逆序數。

樣例輸入 6

2 6 3 4 5 1

樣例輸出 8

提示1. 利用二分歸併排序演算法(分治);

2. 注意結果可能超過int的範圍,需要用long long儲存。

開始沒有思路,我做的題目是沒有提示的,這個題目是上網貼上的,有提示.我開始是沒有想到歸併排序

有這樣乙個題 1 4 3 2這四個數,每次交換相鄰的兩個需要交換幾次才能從小到大排序?先2--3交換,再2--4交換

這是因為4比2大且在2的前面,這就相當於是逆序對。

這道題 需要在歸併排序的時候統計逆序對的個數。

來自 <>

分析:本題難點在於分析如何用歸併法求其逆序數,先來看下逆序數的定義:

某乙個數的逆序數等於在它之前有多少個比它大的數

某乙個序列的逆序數等於所有數的逆序數之和

序列:9 1 0 5 4

逆序數: 4 + 1 + 1 = 6

了解了逆序數的定義後我們來用歸併法進行求解,歸併法的具體操作我就不贅述了,就套乙個模板即可,寫完歸併的模板後只需在歸併處理兩個有序序列合併,且是前指標下標所指元素大於後指標下標所指元素時進行進行一次運算即可,什麼運算呢?我們想一下,當前半部分的有序序列的某個元素大於後半部分有序序列的某個元素時,那麼自然從前半部分指向的那個元素起到中間下標都是大於後面有序序列的,即比後面元素的逆序數為sum =  mid - i + 1(i為前序列的指標下標,mid是中間下標)

如果你聽了還是不明白,估計是你歸併排序掌握的不牢,可以看看我另一篇關於歸併排序的介紹(嘛,雖然說的很水……)

#include

using namespace std;

const int maxn = 100005;

long sum = 0;

int temp[maxn];

void merge(long num, long l, long mid, long r)

else

}

while(i <= mid)

while(j <= r)

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

}

void mergesort(long num, long l, long r)

long mid = (l+r)/2;

mergesort(num, l, mid);

mergesort(num, mid+1, r);

merge(num, l, mid, r);

}

int main()

mergesort(num, 0, n-1);

cout << sum << endl;

return 0;

}

歸併排序 求逆序數

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

歸併排序求逆序數

輸入 n 陣列中元素個數 x 最後所存在的每對逆序對所需要花費的錢 y 按任意順序交換陣列中相鄰兩個元素所要花費的錢 n個陣列中元素 輸出 求使陣列變為公升序所需要的最少 即求該陣列的逆序數 按陣列順序 任意順序交換次數均為該陣列的逆序數次 歸併排序求逆序數 歸併排序採用分治策略 ex 重點在於合併...

歸併排序 求逆序數

time limit 50 ms memory limit 65536 kib problem description 對於數列a1,a2,a3 中的任意兩個數ai,aj i j 如果ai aj,那麼我們就說這兩個數構成了乙個逆序對 在乙個數列中逆序對的總數稱之為逆序數,如數列 1 6 3 7 2 ...