poj2299
这道题的目的为求逆序数,冒泡排序交换相邻元素的次数也就是初始序列的逆序数。
1 #define MAX 500001 2 3 int n,a[MAX],t[MAX]; 4 5 long long sum; 6 7 void merge(int l,int m,int r) 8 { 9 int p=0; 10 int i=l,j=m+1; 11 while(i<=m&&j<=r) 12 { 13 if(a[i]>a[j]) 14 t[p++]=a[j++],sum+=m-i+1; 15 else 16 t[p++]=a[i++]; 17 } 18 while(i<=m)t[p++]=a[i++]; 19 while(j<=r)t[p++]=a[j++]; 20 for(i=0;i<p;i++) 21 a[l+i]=t[i]; 22 } 23 24 25 void mergesort(int l,int r) 26 { 27 int m; 28 if(l<r) 29 m=(l+r)/2, 30 mergesort(l,m), 31 mergesort(m+1,r), 32 merge(l,m,r); 33 } 34 main() 35 { 36 int i; 37 while(~scanf("%d",&n)&&n) 38 { 39 sum=0; 40 for(i=0;i<n;i++) 41 scanf("%d",&a[i]); 42 mergesort(0,n-1); 43 printf("%lld\n",sum); 44 } 45 }
浙公网安备 33010602011771号