歸併排序及利用歸併排序求逆序對數

2021-07-10 04:34:19 字數 497 閱讀 2734

#include #include #include #include #include using namespace std;

/*用歸併排序順便完成統計逆序對數。

因為合併操作是從小到大進行的,當右邊的a[q]複製到t中時,左邊還沒來得及複製到t中的那些數就是左邊所有比a[q]大的數。

此時在累加器中加上左邊的元素個數m-p即可(左邊剩餘元素在區間[p,m)中,因此元素個數為m-p.)

*/int a[10] = ;

int t[10];

int cnt;

void mergesort(int* a, int low, int high, int* t)//將陣列a[low...high-1]從小到大排序,時間複雜度為o(nlogn)

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

a[i] = t[i]; }}

int main()

利用歸併排序求逆序對

在逆序對的問題中,如果採用暴力求解的方法,一般也是有效的,但是o n2 時間複雜度實在是難以接受的。但是對於逆序對問題,卻有乙個看似不想關的演算法來解決 歸併排序。時間複雜度和空間複雜度完全與歸併排序一樣,只是在歸併過程中,新增了乙個變數,對於逆序對的數目進行了記錄。這樣就將時間複雜度降低到了o n...

歸併排序求逆序對

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

歸併排序求逆序對

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