简介:
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。
求逆序数的方法之一是通过归并排序的思想,仅仅只需要添加一行代码就能实现。
模板:
1 int sum=0; 2 3 void mergeArray(int *a,int l,int mid,int r,int *temp) 4 { 5 int i=l,j=mid+1; 6 int k=0; 7 8 while(i<=mid&&j<=r) 9 { 10 if(a[i]<=a[j]) 11 temp[k++]=a[i++]; 12 else{ 13 sum+=mid+1-i; //新增语句 14 temp[k++]=a[j++]; 15 } 16 17 } 18 19 while(i<=mid) 20 temp[k++]=a[i++]; 21 while(j<=r) 22 temp[k++]=a[j++]; 23 24 for(int i=0;i<k;i++) 25 a[l+i]=temp[i]; 26 } 27 28 void mergeSort(int *a,int l,int r,int *temp) 29 { 30 if(l<r) 31 { 32 int mid=(l+r)/2; 33 mergeSort(a,l,mid,temp); 34 mergeSort(a,mid+1,r,temp); 35 mergeArray(a,l,mid,r,temp); 36 } 37 }