问题是问一个数组冒泡排序需要交换几次,交换的次数就等于这个数组中逆序对的个数。
求逆序对需要用归并排序,并在排序的过程中统计(后面的数组中)这个数拷贝到copy数组之前从前面部分拷贝到copy数组中元素的个数,因为这个数就是这个数
所对应的逆序数。统计一下就OK了。结果比较大需要用long long来记录。
#include<iostream>
#include<Cstdio>
#include<string>
using namespace std;
long long result;
int a[500000];
int Copy[500000];
void Merge(int start, int end)
{
if(start >= end)
return;
int bound = (start + end) >> 1;
Merge(start, bound);
Merge(bound + 1, end);
int pos = end;
int i, j = bound, size = 0;
for(i = end; i >= bound + 1; i--)
{
while(j >= start && a[j] > a[i])
{
Copy[pos--] = a[j--];
size++;
}
Copy[pos--] = a[i];
result += size;
}
for(; j >= start; j--)
Copy[pos--] = a[j];
for(i = start; i <= end; i++)
a[i] = Copy[i];
}
int main()
{
int size, i;
while((scanf("%d", &size) != EOF) && size != 0)
{
for(i = 0; i < size; i++)
{
scanf("%d", &a[i]);
}
result = 0;
Merge(0, size - 1);
printf("%lld\n", result);
}
return 0;
}