分治法求逆序數

2021-09-12 15:24:59 字數 1515 閱讀 2176

# include

# include

# include

# include

using namespace std;

int arr2[100] = ;

/*在對序列進行二路歸併排序的時候,要將序列拆分成若干子串行,先將子串行排序,再合併子串行構成最終排序後的序列。

二路歸併演算法還有乙個特點,在進行歸併操作時候的兩個子串行是有序序列,所以,我們可以利用這一點,

在歸併子串行的時候,其中的子串行內部的逆序數必然是0,這時候能產生逆序數的情況必然處於子串行之間,

即:「位置靠後的子串行」中的元素小於「位置靠前的子串行」的元素。例如,有子串行x:2,4,5;子串行y:1,3,6,

顯然,子串行y中的元素1的逆序數為3,子串行y中的元素3的逆序數為2,其他元素的逆序數均為0。

通過這樣一種方法,我們可以在序列的二路歸併排序的過程中將序列的逆序數計算出來。故其時間複雜度為o(nlogn)。

// 歸併排序,並統計兩個有序子串行中的下逆序對數

int merge(int arr2, int p, int q, int r)

, arrr[100] = ;

int i, j;

len1 = q - p + 1;

len2 = r - q;

for (i = 1; i <= len1; i++)

for (j = 1; j <= len2; j++)

// 設定觀察哨

arrl[i] = int_max;

arrr[j] = int_max;

i = 1;

j = 1;

for (int k = 0; k < r - p + 1; k++)

else

}return count;

}// 分治法 計算每個子串行的逆序對數,再合併,求母序列的逆序對數

int sort_count(int arr2, int p, int r)

int q = (p + r) / 2;

int r1, r2, r_total;

r1 = sort_count(arr2, p, q);

r2 = sort_count(arr2, q + 1, r);

r_total = r1 + r2 + merge(arr2, p, q, r);

return r_total;

}int main_4()

cout << "排序前" << endl;

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

cout << endl;

int count = sort_count(arr2, 0, 9);

cout << "排序後" << endl;

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

cout << endl;

cout << "逆序對的個數為:" << count << endl;

system("pause");

return 0;

}

分治法 求排列的逆序數

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

求逆序數(分治法求解)

題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 輸入描述 題目保證輸入的陣列中沒有的相同的數字 資料範圍 對於 50的資料,size 1...

分治 求 逆序數

利用歸併,逆序數等於 左邊逆序數 右邊逆序數,加上 左邊 的每個數與右邊的每個數構成的逆序數。歸併過程 把 左邊和右邊按照從小到大排序 在 merge過程中發現a 右邊 a 左邊 說明 在此左邊p1位置的右側的數都能與 此時的p2位置的 a p2 構成逆序對。故 逐一對a j 進行判斷,累加即可得到...