归并排序及逆序对

归并排序挺好写的,复杂度不错,还是个稳定性排序算法,而且可以求逆序对个数。


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
ll a[N],b[N];
void Merge(ll l,ll mid,ll r)
{
    ll i=l,j=mid+1,t=0;
    while(i<=mid&&j<=r)
    {
        if(a[i]>a[j])
            b[t++]=a[j++];
        else
            b[t++]=a[i++];
    }
    while(i<=mid)
        b[t++]=a[i++];
    while(j<=r)
        b[t++]=a[j++];
    for(i=0;i<t;i++)
        a[l+i]=b[i];
}
void MergeSort(ll l,ll r)
{
    if(l<r)
    {
        ll mid=(l+r)>>1;
        MergeSort(l,mid);
        MergeSort(mid+1,r);
        Merge(l,mid,r);
    }
}

在合并中加一步就可以求逆序对:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
ll a[N],b[N],cnt=0;
void Merge(ll l,ll mid,ll r)
{
    ll i=l,j=mid+1,t=0;
    while(i<=mid&&j<=r)
    {
        if(a[i]>a[j])
        {
            b[t++]=a[j++];
            cnt+=mid-i+1;
        }
        else
            b[t++]=a[i++];
    }
    while(i<=mid)
        b[t++]=a[i++];
    while(j<=r)
        b[t++]=a[j++];
    for(i=0;i<t;i++)
        a[l+i]=b[i];
}
void MergeSort(ll l,ll r)
{
    if(l<r)
    {
        ll mid=(l+r)>>1;
        MergeSort(l,mid);
        MergeSort(mid+1,r);
        Merge(l,mid,r);
    }
}

img_show