7-7 逆序对(20 分)
对于一个包含N个非负整数的数组A[1..n],如果有i < j,且A[ i ]>A[ j ],则称( i , j )为数组A中的一个逆序对。 例如,数组(3,1,4,5,2)的逆序对有(3,1),(3,2),(4,2),(5,2),共4个。
输入格式:
输入包含若干组数据,第一行为一个整数T(0<T<20),表示共有T组测试数据。接下来每组测试数据包括两行,第一行只有一个整数m(0<m<=1000),表示数组有m个数,第二行为m个整数,数据之间用空格分隔。
输出格式:
对输入中的每组测试数据,输出一行对应逆序对的个数。
输入样例:
在这里给出一组输入。例如:
2
5
3 1 4 5 2
10
1 2 3 4 5 6 7 8 9 10
输出样例:
在这里给出相应的输出。例如:
4
0
#include<iostream>
#include<cstring>
using namespace std;
int a[1005];
static int count=0;
int merge(int a[],int begin,int mid,int end){
int result[end-begin+1];
int i=begin;
int j=mid+1;
int k=0;
while(i<=mid&&j<=end){
if(a[i]<=a[j])
result[k++]=a[i++];
else{
count+=mid-i+1;
result[k++]=a[j++];
}
}
while(j<=end)
result[k++]=a[j++];
while(i<=end)
result[k++]=a[i++];
for(k=0;k<end-begin+1;k++)
a[begin+k]=result[k];
return count;
}
int mergeSort(int a[],int begin,int end ){
int sum=0;
if(begin<end){
int mid=(begin+end)/2;
mergeSort(a,begin,mid);
mergeSort(a,mid+1,end);
sum=merge(a,begin,mid,end);
}
return sum;
}
int main(){
int t,m;
cin>>t;
while(t--){
cin>>m;
for(int i=0;i<m;i++){
scanf("%d",&a[i]);
}
cout<<mergeSort(a,0,m-1);
cout<<endl;
count=0;
}
return 0;
}