歸併排序
圖來自維基
遞迴呼叫的過程需要在腦中模擬清楚
然後是**的細節問題
多複習多理解
劉汝佳版
#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...