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;
    }
  • 相关阅读:
    安卓监听帧动画结束
    零基础学python-13.4 文件上使用列表解析与列表解析扩展
    零基础学python-13.3 列表解析简介与步骤分解
    零基础学python-13.2 手动迭代:iter和next
    零基础学python-13.1 迭代器简介与文件迭代器
    零基础学python-12.6 使用for和zip来并行使用多个序列
    零基础学python-12.5 修改列表的误区以及使用for和range修改列表
    零基础学python-12.4 while、for与range联合使用
    零基础学python-12.3 for循环
    零基础学python-12.2 关键字pass,else,break,continue
  • 原文地址:https://www.cnblogs.com/HappyKnockOnCode/p/12761127.html
Copyright © 2011-2022 走看看