• POJ--2299 Ultra-QuickSort 归并排序——求逆序数


    @[归并排序求逆序数]()

    题意

    给一个序列,求它的逆序数

    归并排序

    给一个序列 9 1 0 5 4,进行归并排序:(从小到大)

    下标 0 1 2 3 4
    数值 9 1 0 5 4

    单个元素为一组,两两合并为有序序列:

    下标 0 1 2 3 4
    数值 1 9 0 5 4

    2个元素为一组,每两组合并:

    下标 0 1 2 3 4
    数值 0 1 5 9 4

    最后两组合并:

    下标 0 1 2 3 4
    数组 0 1 4 5 9

    在合并的过程中,就相当于两个有序序列合成一个有序序列

    那么怎么分成两组呢?

    递归派上了用场!从1~n开始分,知道分不了,利用回溯进行排序,完全ok

    怎样求逆序数

    在两个有序序列合并的时候,一个是left序列,一个是right序列,当right序列某个元素跑到left前面了,计算一下,left的长度减去跑的位置,就是当前这个数的逆序啦

    撸代码:

    #include<stdio.h>
    #define N 500050
    long long ans;
    int a[N],n,t[N];
    void Sort(int l,int mid,int r)
    {
        int i=l,j=mid+1;/**将分开的左右两个有序链表合并*/
        int k=l;
        while(i<=mid&&j<=r)
        {
            if(a[i]<=a[j])
            {
                t[k++]=a[i++];
            }
            else
            {
                t[k++]=a[j++];
                ans+=mid-i+1;/**统计 a[j]的 逆序数*/
            }
        }
        while(i<=mid)
        {
            t[k++]=a[i++];
        }
        while(j<=r)
        {
            t[k++]=a[j++];
        }
        for(int i=l;i<=r;i++)
        {
            a[i]=t[i];
        }
        return ;
    }
    void departSort(int l,int r)
    {
        if(l<r)
        {
            int mid=(l+r)>>1;
            departSort(l,mid);
            departSort(mid+1,r);/**分完之后,排序*/

            Sort(l,mid,r);
        }
        return ;
    }

    int main()
    {
        while(~scanf("%d",&n)&&n)
        {
            ans=0;
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&a[i]);
            }
            departSort(1,n);/**归并排序*/
            printf("%lld ",ans);
        }
        return 0;
    }
  • 相关阅读:
    Spring5.0的第一次尝鲜
    java客户端Jedis操作Redis Sentinel 连接池
    【转载】Redis Sentinel服务配置
    Dubbo的配置及启动
    【转载】Zookeeper 安装和配置
    【转载】redis.conf文件详解
    【转载】Redis优化经验
    【转载】Redis sort 排序命令详解
    redis的maxmemory设置以及淘汰策略介绍
    【转载】redis优化配置和redis.conf说明
  • 原文地址:https://www.cnblogs.com/HappyKnockOnCode/p/12761127.html
Copyright © 2020-2023  润新知