归并排序
#include<cstdio>
const int MAXN=200005;
int n, a[MAXN], temp[MAXN];
long long ans;
void count(int l, int r) {
if(r == l) return ;//结束条件
int m = (l + r) >> 1;
count(l, m);
count(m + 1, r);//二分查找
int i = l, j = m + 1, k = l;
while(j <= r || i <= m) {
if(j > r || (i <= m && a[i] < a[j]))
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
for(i = l; i <= r; i++) a[i] = temp[i];
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for(int i = 1; i <= n; i++)
printf("%d ", a[i]);
return 0;
}
逆序对
#include<cstdio>
const int MAXN=200005;
int n, a[MAXN], temp[MAXN];
long long ans;
void count(int l, int r) {
if(r == l) return ;//结束条件
int m = (l + r) >> 1;
count(l, m);
count(m + 1, r);//二分查找
int i = l, j = m + 1, k = l;
while(j <= r || i <= m) {
if(j > r || (i <= m && a[i] < a[j]))
temp[k++] = a[i++];
else
temp[k++] = a[j++], ans += m - i + 1;
}
for(i = l; i <= r; i++) a[i] = temp[i];
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
count(1, n);//调用函数
printf("%lld", ans);//输出
return 0;
}