分治遞迴逆序數 模板 歸併排序 逆序數 分治

2021-10-16 14:53:44 字數 2138 閱讀 6974

歸併排序

圖來自維基

遞迴呼叫的過程需要在腦中模擬清楚

然後是**的細節問題

多複習多理解

劉汝佳版

#include

using namespace std;

const int maxn = 1e5 + 10;

int ans = 0;

int arr[maxn] = ;

int brr[maxn] = ;

void mergesort(int *arr, int fst, int lst, int *brr)

if(lst - fst > 1)

int mid = fst + (lst - fst) / 2;

int p = fst, q = mid, i = fst;

mergesort(arr, fst, mid, brr);

mergesort(arr, mid, lst, brr);

while(p < mid || q < lst)

if(q >= lst || (p < mid && arr[p] <= arr[q]))

brr[i++] = arr[p++];

else

brr[i++] = arr[q++];

ans += mid - p;

for(i = fst; i < lst; i++)

arr[i] = brr[i];

int main()

int n;

cin>>n;

for(int i = 0; i < n; i++)

cin>>arr[i];

mergesort(arr, 0, n, brr);

//for(int i = 0; i < n; i++)

//cout<

cout<

return 0;

//正月點燈籠版

#include

using namespace std;

long long ans = 0; //宣告逆序數

void merge(int a, int l, int m, int r)

int leftlen = m - l;

int rightlen = r - m + 1;

int left[leftlen];

int right[rightlen];

int i , j , k;

for(i = l; i < m; i++)

left[i - l] = a[i];

for(i = m; i <= r; i++)

right[i - m] = a[i];

i = 0; j = 0; k = l;

while(i < leftlen && j < rightlen)

if(left[i] < right[j])

a[k++] = left[i++];

else

a[k++] = right[j++];

ans += leftlen - i; //求逆序數

while(i < leftlen)

a[k++] = left[i++];

while(j < rightlen)

a[k++] = right[j++];

void merge_sort(int a, int l, int r)

if(l == r)

return ;

else

int m = (r + l) / 2;

merge_sort(a, l, m); //遞迴分解左側

merge_sort(a, m + 1, r); //遞迴分解右側

merge(a,l,m + 1,r); //合併

int main()

ios::sync_with_stdio(false);

int a[50010];

int n;

cin>>n;

for(int i = 0; i < n; i++)

cin>>a[i];

merge_sort(a,0,n - 1);

for(int i = 0; i < n; i++)

cout<

cout<

cout<

return 0;

求逆序數 逆序數 歸併排序

求排列的逆序數 分治 一 題目描述 總時間限制 1000ms 記憶體限制 65536kb 描述 在internet上的搜尋引擎經常需要對資訊進行比較,比如可以通過某個人對一些事物的排名來估計他 或她 對各種不同資訊的興趣,從而實現個性化的服務。對於不同的排名結果可以用逆序來評價它們之間的差異。考慮1...

求逆序數 歸併排序 (模板)

之前不知道逆序數是什麼,今天才了解了一下,主要樸素的方法是n 2的,所以可以用歸併排序,線段樹還有樹狀陣列三種方法來做。先學了歸併排序的做法,發現還是挺簡單的。include include includeusing namespace std const int maxn 5e5 5 int nu...

歸併排序 逆序數

對於數列a,將其二分地拆分為b,c 先將b,c分別排序好,再合併b,c即為總的排序,不過在合併的過程中我們可以算出逆序數哦。其原理網上很多,我這裡不再贅述,只給出實現 include include define ll long long using namespace std ll mergeso...