求逆序对

Posted yulinss

tags:

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

逆序对

首先我们来认识一下什么叫做逆序对:如果对于 i<j,a[i]>a[j],那么a[i]和a[j]就是一对逆序对

树状数组求逆序对

我们挨个把a数组放进树状数组里,对于每一个a[i],统计a[1...i-1]中有多少个数比a[i]大,就有多少对逆序对

int n=read();
for (int i=1;i<=n;i++){
    int x=read();  //读入a数组
    add(x,1);  //将b[x]的值加一
    ans+=i-sum(x);  //sum(x)求出a[1...i]中有多少个数小于等于a[i]
} 
printf("%d ",ans);

 

归并排序求逆序对

归并排序是一种基础的排序方法。

当然,在c++中允许使用STL后,归并渐渐地不常用了,毕竟任何一种排序方法都没有sort来的爽快

然而,归并还是有着自己的优势的,其中最突出的一点就是能够计算逆序对

 

void merge_sort(int l,int r){
    if(l>=r) return;
    int mid=(l+r)/2;
    merge_sort(l,mid);
    merge_sort(mid+1,r);
    int i=l,j=mid+1,k=l;
    while(i<=mid||j<=r){
        if((a[i]<=a[j]&&i<=mid)||j>r){
            b[k++]=a[i++];
        }
        else{
            ans+=mid-i+1;
            b[k++]=a[j++]; 
        }    
    }
    for (int i=l;i<=r;i++) a[i]=b[i];
}

 

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

树状数组求逆序对

归并排序求逆序对

归并排序求逆序对

线段树求逆序对

一道编程题:求逆序对的个数

Another Version of Inversion 二维树状数组求逆序对