歸併排序求解逆序對數

2021-10-02 07:18:24 字數 1095 閱讀 2963

定義

逆序對就是對於ia[j],這樣的數對在序列中的個數。

求解方法

·  歸併排序是採用分治的思想劃分數列,然後將兩路有序的數列合併。通過劃分和合併的遞迴呼叫來完成排序。在合併的過程中,兩個數列中的元素的相對位置不會發生改變(這裡只是前後關係)。而且如果後乙個數列b中某個元素b在需要先放入(優先於前乙個數列a數列元素a),則a在b的前面,但是b小於a這樣就會產生逆序對,對數的數目為(數列b中b包括b在內的b前面的元素)都能與a產生逆序對。

對於每次位置的改變不會產生逆序對,如果改變前存在逆序對,那麼將會計算一部分,未計算的部分未改變。

**實現:

#include

#include

using

namespace std;

#define ll long long

#define max 5000100

int a[max]

;ll cnt;

void

marge

(int l,

int mid,

int r)

else

}while

(i<=mid)

while

(j<=r)

for(

int s=

1;s<=n;s++)}

void

margesort

(int l,

int r)

inline

intread()

while

(ch>=

'0'&&ch<=

'9') x=x*10+

(ch^48)

,ch=

getchar()

;return x*f;

}int

main()

margesort(1

,n);

cout

歸併排序求逆序對數

參考部落格 歸併排序求逆序對數 include include include includeusing namespace std 歸併排序是借助乙個輔助陣列來進行排序 int ans 0 void merge sort int a,int l,int r,int t a是原陣列,t是輔助陣列 i...

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

include include include include include using namespace std 用歸併排序順便完成統計逆序對數。因為合併操作是從小到大進行的,當右邊的a q 複製到t中時,左邊還沒來得及複製到t中的那些數就是左邊所有比a q 大的數。此時在累加器中加上左邊的元...

歸併排序計算逆序對數目

陣列a中的乙個逆序對 a i a j 是ia j 平凡的方法是遍歷所有數對,時間複雜度為o n 2 利用歸併排序的思想可以降至o nlgn include include include include include using namespace std 平凡的計算逆序數的方法 比較陣列中的所有...