1 #include<iostream>
2 #include<cstdlib>
3 #include<climits>
4 using namespace std;
5
6
7 int Inversion(int a[],int start,int mid,int end){
8
9 int PairNum = 0;
10
11 for(int i=start;i<=mid;++i){
12
13 for(int j=mid+1;j<=end;++j){
14
15 if(a[i]>a[j])
16 ++PairNum;
17 }
18 }
19
20 return PairNum;
21 }
22 int Inversion1(int a[],int low,int mid,int high){
23 int sub1_len=mid-low+1;
24 int sub2_len=high-mid;
25 int PairNum = 0;
26 int *L=NULL,*R=NULL;
27 L = (int *)malloc(sizeof(int)*(sub1_len));
28 R = (int *)malloc(sizeof(int)*(sub2_len));
29 for(int i=0;i<=sub1_len-1;++i){
30 L[i]=a[low+i];
31 }
32 for(int j=0;j<=sub2_len-1;++j){
33 R[j]=a[mid+1+j];
34 }
35 int i= 0;
36 int j =0;
37 int k= low;
38 while(i<sub1_len&&j<sub2_len){ //注意这里的循环条件,不是k<=high!!!
39 if(L[i]<=R[j])
40 a[k++] = L[i++];
41 else {
42 a[k++] = R[j++];
43 PairNum += sub1_len-i; //当R数组元素r较小时 L中剩的元素个数是L中大于r的元素的个数, 累加起来即为有序的俩个子数组间的逆序数
44 }
45
46
47 }
48 while(i<sub1_len)
49 a[k++]= L[i++];
50 while(j<sub2_len)
51 a[k++]= R[j++];
52 return PairNum;
53 }
54
55 int InversionPair(int a[],int start, int end){
56
57 int mid = 0;
58 int p,q,r;
59 if(start<end){
60
61 mid = (start+end)/2;
62 return InversionPair(a,start,mid)+InversionPair(a,mid+1,end)+Inversion1(a,start,mid,end);;
63 }
64 else
65 return 0;
66 }
67
68
69
70 int main(){
71
72 int num;
73 int InversionPairNum;
74 while(1){
75 cin>>num;
76 InversionPairNum=0;
77 int *array=NULL;
78 array = (int *)malloc(sizeof(int)*(num));
79 for(int i=0;i<num;i++) cin>>array[i];
80 InversionPairNum = InversionPair(array,0,num-1);
81
82 cout<<InversionPairNum<<endl;
83 }
84
85 return 0;
86 }