zoukankan      html  css  js  c++  java
  • 求逆序数

    第一部分:题目

    描述

    在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。

    现在,给你一个N个元素的序列,请你判断出它的逆序数是多少。

    比如 1 3 2 的逆序数就是1。

     
    输入
    第一行输入一个整数T表示测试数据的组数(1<=T<=5)
    每组测试数据的每一行是一个整数N表示数列中共有N个元素(2〈=N〈=1000000)
    随后的一行共有N个整数Ai(0<=Ai<1000000000),表示数列中的所有元素。

    数据保证在多组测试数据中,多于10万个数的测试数据最多只有一组。
    输出
    输出该数列的逆序数
    样例输入
    2
    2
    1 1
    3
    1 3 2
    样例输出
    0
    1

     

    第二部分:思路

    利用归并算法在排序时改一下就可以了。归并算法请查阅资料。

     

     

    第三部分:代码

    #include<stdio.h>
    int s[1000000];
    int r[1000000];
    long long count;
    void show(int start,int end)//归并排序+逆序数计算
    {
        if(start==end)//如果只有一个数字就返回
        {
            return ;
        } 
        if(start+1==end)//两个数时直接进行排序,顺便记录逆序数
        {
            if(s[start]>s[end])
            {
                int t=s[start];
                s[start]=s[end];
                s[end]=t;
                count++;
            }
        }
        else
        {
            int temp=(start+end)/2;//当数字个数超过2时,每次“对折”进行排序
            if(start<temp)
            {
                show(start,temp);
            }
            if(temp+1<end)
            {
                show(temp+1,end);
            }
            //合并
            int k,i,j;
            for(k=start,i=start,j=temp+1;k<=end&&i<=temp&&j<=end;  )//折半后合并:从小到大排序。这里排序时使用了中间数组。如果使用循环的话会超时,这里就出现一个点:有时可以牺牲空间来保证时间。
            {
                if(s[i]<=s[j])
                {
                    r[k++]=s[i];
                    i++;
                }
                else
                {
                    r[k++]=s[j];
                    count+=temp-i+1;
                    j++;
                }
            }
            while(i<=temp)
            {
                r[k++]=s[i];
                i++;
            }
            while(j<=end)
            {
                r[k++]=s[j];
                j++;
            }
            for(i=start;i<=end;i++)
            {
                s[i]=r[i];
            }
        }
    }
    int main()
    {
        int t,n,i;
        scanf("%d",&t);
        while(t--)
        {
            count=0;
            scanf("%d",&n);
            for(i=0;i<n;i++)
            {
                scanf("%d",&s[i]); 
            } 
            show(0,n-1);
            printf("%lld
    ",count);
        }
        return 0;
    }
  • 相关阅读:
    Tengine 2.1.2 (nginx/1.6.2)安装配置,淘宝 Web 服务器
    Grafana3.0.1+Zabbix3.0.4监控系统平台搭建
    邮件服务器配置
    python批量连接mysql
    虚拟主机ip配置,nginx.conf文件配置及日志文件切割
    运维自动化的必要条件
    python扫描端口脚本
    zabbix_windowsagent_cpu
    ftp传输文件到指定服务器
    pstools工具使用
  • 原文地址:https://www.cnblogs.com/xiangguoguo/p/5427099.html
Copyright © 2011-2022 走看看