#include <cstdio> #include <iostream> using namespace std; int ans = 0; void merge(int* l, int* mid, int *r) { int b[r-l]; int *i = l, *j = mid, cur = 0; while(i<mid || j<r) { if(i<mid && (j>=r || *i <= *j)) b[cur++] = *i++; else { b[cur++] = *j++; ans += mid - i; } } for(int *p=l, i=0; p < r; p++, i++) *p = b[i]; } void merge_sort(int *l, int *r) // [ , ) { if(r-l==1) return; int* mid = l+(r-l)/2; merge_sort(l, mid); merge_sort(mid, r); merge(l, mid, r); } int main () { int a[] = {6,2,1,8,7,5,3,4}; // int a[] = {2,4,3,1}; int n = sizeof(a) / sizeof(int); ans = 0; merge_sort(a, a+n); for(int i=0; i<n; i++) printf("%d ", a[i]); printf("\n"); printf("逆序数为:%d\n", ans); return 0; }