题解:
其实题目就是说了一个冒泡排序,但是肯定不能直接就用冒泡了…
如果要求求解一共需要交换多少次次序,那就可以使用归并算法,直接计算逆序对就可以。
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int maxn = 5e5 + 17;
ll a[maxn] = {},b[maxn] = {},cnt = 0;
void merge_sort(int l,int r)
{
if(l >= r)return ;
int mid = (l + r)/2;
int p = l;
int q = mid + 1;
int pos = l;
merge_sort(l,mid);
merge_sort(mid + 1,r);
while(p <= mid||q <= r){
if(q > r||(p <= mid&&a[p] <= a[q])){
b[pos++] = a[p++];
}
else{
cnt += mid - p + 1;
b[pos++] = a[q++];
}
}
for(int i = l;i <= r;i++){
a[i] = b[i];
}
}
int main()
{
int n;
while(scanf("%d",&n)){
cnt = 0;
if(n == 0) break;
for(int i = 1;i <= n;i++) scanf("%lld",&a[i]);
merge_sort(1,n);
printf("%lld\n",cnt);
}
return 0;
}