zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    多线程实现双色球
    使用google api material icons在网页中插入图标
    网页前端制作好的网站
    n元线性方程非负整数解的个数问题
    Dilworth定理证明
    一个简易的Python全站抓取系统
    gensim word2vec好的教程
    C语言一些常用的功能
    python3正则表达式
    python3创建目录
  • 原文地址:https://www.cnblogs.com/HappyKnockOnCode/p/12761127.html
Copyright © 2011-2022 走看看