求逆序数

Posted antarctic

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求逆序数相关的知识,希望对你有一定的参考价值。

简介:

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

 

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

 

模板:

 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 } 

 

 

 

以上是关于求逆序数的主要内容,如果未能解决你的问题,请参考以下文章

树状数组求逆序数及变形(个人理解)

求排列的逆序数

JAVA求四个正整数,逆序数1234。这些求余怎么求啊!

树状数组求逆序数

求排列的逆序数之树状数组

逆序对问题---求逆序数