分治法求整數序列的逆序數

2021-06-12 13:42:40 字數 2000 閱讀 2012

在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個

逆序。乙個排列中逆序的總數就稱為這個排列的

逆序數

求逆序數的方法很多。最容易想到的辦法是分別對序列中每乙個元素求其逆序數,再求所有元素的逆序數總和,易分析得出這樣的方法其時間複雜度為o(n2

)。 這裡介紹一種分治的方法求逆序數,其思路如下。

我們知道在對序列進行二路歸併排序的時候,要將序列拆分成若干子串行,先將子串行排序,再合併子串行構成最終排序後的序列。二路歸併演算法還有乙個特點,在進行歸併操作時候的兩個子串行是有序序列,所以,我們可以利用這一點,在歸併子串行的時候,其中的子串行內部的逆序數必然是0,這時候能產生逆序數的情況必然處於子串行之間,即:「位置靠後的子串行」中的元素小於「位置靠前的子串行」的元素。例如,有子串行x:2,4,5;子串行y:1,3,6,顯然,子串行y中的元素1的逆序數為3,子串行y中的元素3的逆序數為2,其他元素的逆序數均為0。通過這樣一種方法,我們可以在序列的二路歸併排序的過程中將序列的逆序數計算出來。故其時間複雜度為o(nlogn)。

其**實現如下:

h1.h

#ifndef h1_h

#define h1_h

#include#include#include/* malloc()等 */

#include/* int_max等 */

#include/* eof(=^z或f6),null */

#include/* atoi() */

#include/* eof() */

#include/* floor(),ceil(),abs() */

#include/* exit() */

#define maxsize 100

#define true 1

#define false 0

#define ok 1

#define error 0

#define infeasible -1

/* #define overflow -2 因為在math.h中已定義overflow的值為3,故去掉此行 */

typedef int status; /* status是函式的型別,其值是函式結果狀態**,如ok等 */

typedef int boolean; /* boolean是布林型別,其值是true或false */

#endif

inversioncount.c

#include "h1.h"

int mergecount(int a, int low, int center, int high)

int *temp = (int *)malloc(sizeof(int)*maxsize);

if(!temp)

count = 0;

for(i=low,j=(center+1),k=0; i<=center&&j<=high; )

else

} while(i <= center)

while(j <= high)

for(i=low; i<=high; i++)

free(temp);

return count;

}int inversioncount(int a, int low, int high)

else

}int main();

int i, result=0;

result = inversioncount(a, 1, 12);

printf("the numbers sorted:\n");

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

printf("\nthe inversion count is: %d\n", result);

return 0;

}

注上述測試的序列為:

排在第一位的12表示元素個數,其最終逆序數為13.

分治法求逆序數

include include include include using namespace std int arr2 100 在對序列進行二路歸併排序的時候,要將序列拆分成若干子串行,先將子串行排序,再合併子串行構成最終排序後的序列。二路歸併演算法還有乙個特點,在進行歸併操作時候的兩個子串行是有...

分治法 求排列的逆序數

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

求逆序數(分治法求解)

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