歸併排序 求解顯著逆序對

2021-09-27 03:18:07 字數 809 閱讀 4700

求解逆序對,可以採取歸併排序的方法

即當前半部分a[i]大於後半部分a[j]時,結果res+=m-i+1  

(其中m-i+1表示前半部分a[i]及其之後所有元素與a[j]構成逆序對)

顯著逆序對 a[i]>3a[j+1]

具體思路,當a[i]>a[j]時

進一步從此開始向後尋找到乙個a[k]>3a[j]

那麼res+=m-k+1;

注意可能出現a[j]temp;//存放排序後序列

int mid = (first + last) / 2;

int i = first, m = mid;//前部分有序序列 後部分有序序列

int j = mid + 1, n = last;//變數範圍

while (i <= m && j <= n)}}

else

}while (i <= m) //可能剩下元素

while (j <= n)

//將結果覆蓋到源陣列

for (i = first; i <= last; i++)

}} void mergesort(int data, int first, int last) }

int inversepairs(int data,int n)

int a[100000];

int main()

printf_s("%d",inversepairs(a,n));

}

歸併排序求解逆序對數

定義 逆序對就是對於ia j 這樣的數對在序列中的個數。求解方法 歸併排序是採用分治的思想劃分數列,然後將兩路有序的數列合併。通過劃分和合併的遞迴呼叫來完成排序。在合併的過程中,兩個數列中的元素的相對位置不會發生改變 這裡只是前後關係 而且如果後乙個數列b中某個元素b在需要先放入 優先於前乙個數列a...

逆序對 (歸併排序)

逆序對的nlogn方法,改進後的歸併排序 給定排列p,求排列的逆序對數量。p的長度 100000。要求o nlogn 定義歸併排序過程merge l,r merge l,r merge l,mid merge mid 1,r count l,mid,mid 1,r 只需要考慮左右兩段之間造成的逆序對...

歸併排序 逆序對

按照劉汝佳說的,歸併排序分三步 1.劃分問題,即把序列分成元素盡量相等的兩半 2.遞迴求解 3.合併子問題 其實就是把乙個序列不斷的二分,直到只有兩個元素的時候,然後排序,然後返回,再排序。先上 include using namespace std long long a 100005 t 100...