在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個
逆序。乙個排列中逆序的總數就稱為這個排列的
逆序數。
求逆序數的方法很多。最容易想到的辦法是分別對序列中每乙個元素求其逆序數,再求所有元素的逆序數總和,易分析得出這樣的方法其時間複雜度為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...