填坑之归并排序

填坑之归并排序

归并排序:

复杂度:稳定的O(nlogn)

空间:两倍空间

应用:求逆序对

算法思想:将数据划分为若干个有序的小区间,每次将两个区间合并时也许满足有序

逆序对 洛谷P1908

利用归并排序的思想,每次出现右端区间的数小于左区间时,统计出现的逆序对数目

#include <iostream>
#include <cstdio>
using namespace std;
#define ll long long
#define R register
int n;long long ans=0;
int a[500005+5],rr[500005+5];
void msort(int l,int r)
{
    int mid=l+r>>1;
    if(l==r)return;
    msort(l,mid);msort(mid+1,r);
    int x=l,y=mid+1,tot=l;
    while(x<=mid&&y<=r)
        if(a[x]<=a[y])rr[tot++]=a[x++];
        else rr[tot++]=a[y++],ans+=(ll)mid-x+1;
    while(x<=mid)rr[tot++]=a[x++];
    while(y<=r)rr[tot++]=a[y++];
    for(R int i=l;i<=r;i++)a[i]=rr[i];
}
int main()
{
    scanf("%d",&n);
    for(R int i=1;i<=n;i++)scanf("%d",&a[i]);
    msort(1,n);
    printf("%lld\n",ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/LianQ/p/11335967.html
今日推荐