並歸排序法求逆序數 收藏

2021-08-24 19:36:15 字數 1170 閱讀 1051

並歸排序法求逆序數 收藏

逆序對(inversion pair)是指在序列中,若aij),則(ai,aj)上一對逆序對。而逆序數 (inversion number)顧名思義就是序列中逆序對的個數。例如: 1 2 3是順序,則逆序數是0;1 3 2中(2,3)滿足逆序對的條件,所以逆序數只有1; 3 2 1中(1,2)(1,3)(2,3)滿足逆序對,所以逆序是3。由定義不能想象,序列n的逆序數範圍在[0,n*(n-1)/2],其中順序時逆序數為 0,完全逆序時逆序數是n*(n-1)/2。

就我所知,目前求這種逆序對最快的演算法是利用歸併排序,其時間複雜度為o(nlgn), 空間複雜度為o(n)

閒話少說,看**

#include

#include

/**///

//求逆序數

//最快的演算法是歸併排序時計算逆序個數,時間複雜度是nlog2n, 空間複雜度是2n

//a為字元陣列,len為字元陣列的長度

int number = 0; //number表示逆序對的個數

void mergepass(char *, char *, int, int);

void merge(char*, char*, int, int, int);

void copy(char *dest, char *src, int l, int r)

...}

void mergesort(char *a, int size)

...void mergepass(char *a, char *b, int l, int r)

...}

void merge(char *a, char *b, int l, int m, int r)

...}

while(i <= m)

b[l++] = a[i++];

while(j <= r)

b[l++] = a[j++];

}int main()

...;

char b[5] = ...;

mergesort(b, 5);

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

printf("%c ",a[i]);

printf("%d ", number);

system("pause");

return 0;

}

歸併法排序求逆序數

歸併排序 merge sort,台灣譯作 合併排序 是建立在歸併操作上的一種有效的 排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。歸併操作 merge 也叫歸併演算法,指的是將兩個已經排序的序列合併成乙個序列的操作。歸併排序演算法依賴歸併操作。歸併操作...

歸併法求逆序數

求逆序數 時間限制 2000 ms 記憶體限制 65535 kb 難度 5 描述 在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。現在,給你乙個n個元素的序列,請你判斷出它的逆序數是多少。比如 1 3 2 ...

分治法求逆序數

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