設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 分別進行歸併排序,然後再將這兩半合併起來。在合併的...