合併排序法求n個數的逆序對

2021-06-11 20:00:44 字數 1079 閱讀 6156

設a[1...n]是乙個包含n個不同數的陣列。如果在i < j 的情況下, 有a[i] > a[j], 則(i, j)就稱為a中的乙個逆序對(inversion)。

合併排序使用了分治法,每一層遞迴都有三個步驟:分解,解決,合併。

下面用合併排序的演算法求乙個陣列的逆序對數。時間複雜度 ο(nlgn)。

執行結果為:1 2 3 4 5 6 7 8 9  10 arr has 45 reversions.

#include using namespace std;

/*合併排序的合併過程*/

void merge(int arr, int low, int mid, int high);

/*合併排序*/

void merge_sort(int arr, int low, int high);

/*逆序數的計數*/

int reverse_count = 0;

int main()

; merge_sort(arr, 0, 9);

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

cout << "arr has " << reverse_count << " reversions." << endl;

return 0;

}void merge(int arr, int low, int mid, int high)

for (j = 0; j < rightlistcount; ++j)

i = 0;

j = 0;

int k = low;

//按序將左右陣列合併到主陣列中

while (i < leftlistcount && j < rightlistcount)

else

}//左陣列合併完畢

if (i == leftlistcount) }

//右陣列合併完畢

if (j == rightlistcount) }

}//遞迴呼叫合併排序

void merge_sort(int arr, int low, int high)

}

逆序對個數(歸併排序)

description 給出乙個陣列a,問這個陣列中有多少個逆序對。逆序對定義 若ia j 則 a i a j 是乙個逆序對。如陣列3 4 1 2中的逆序對有 3,1 3,2 4,1 4,2 共4個逆序對。input 第一行乙個整數n,表示元素個數。第二行n個空格分隔的整數a i output 乙個...

歸併排序求逆序對

排序都用qsort了,別的排序演算法不怎麼用,但有些排序的思想很重要。碰到一道求逆序對的題,要用到歸併排序,學習了一下歸併排序。歸併排序是用分治思想,分治模式在每一層遞迴上有三個步驟 分解 將n個元素分成個含n 2個元素的子串行。解決 用合併排序法對兩個子串行遞迴的排序。合併 合併兩個已排序的子串行...

歸併排序求逆序對

我們知道,求逆序對最典型的方法就是樹狀陣列,但是還有一種方法就是merge sort 即歸併排序。實際上歸併排序的交換次數就是這個陣列的逆序對個數,為什麼呢?我們可以這樣考慮 歸併排序是將數列a l,h 分成兩半a l,mid 和a mid 1,h 分別進行歸併排序,然後再將這兩半合併起來。在合併的...