求逆序数

简介:

在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。

 

求逆序数的方法之一是通过归并排序的思想,仅仅只需要添加一行代码就能实现。

 

模板:

 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 } 

 

 

 

posted @ 2019-11-27 23:52  南极的太阳  阅读(289)  评论(0编辑  收藏  举报