数据结构实验之排序五:归并求逆序数

题目描述

对于数列a1,a2,a3…中的任意两个数ai,aj (i < j),如果ai > aj,那么我们就说这两个数构成了一个逆序对;在一个数列中逆序对的总数称之为逆序数,如数列 1 6 3 7 2 4 9中,(6,4)是一个逆序对,同样还有(3,2),(7,4),(6,2),(6,3)等等,你的任务是对给定的数列求出数列的逆序数。

输入

输入数据N(N <= 100000)表示数列中元素的个数,随后输入N个正整数,数字间以空格间隔。

输出

输出逆序数。

示例输入

10
10 9 8 7 6 5 4 3 2 1

示例输出

45

提示




/*归并排序是将数列a[l,h]分成两半a[l,mid]和a[mid+1,h]分别进行归并排序,然后再将这两半合并起来。
在合并的过程中(设l<=i<=mid,mid+1<=j<=h),当a[i]<=a[j]时,并不产生逆序数;当a[i]>a[j]时,在
前半部分中比a[i]大的数都比a[j]大,将a[j]放在a[i]前面的话,逆序数要加上mid+1-i。因此,可以在归并
排序中的合并过程中计算逆序数.*/
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int tr[100001],sr[100001];//这里定义了一个暂时储存的数组,和一个输入数组、
long int sum;
void Merge(int s1,int e1,int s2,int e2)
{
    int a=s1;//第一段序列的下标
    int b=s2;//第二段序列的下标
    int c=0;//暂存数组的下标
    while(a<=e1&&b<=e2)// 判断第一段和第二段取出的数哪个更小,将其存入合并序列,并继续向下遍历
    {
        if(sr[a]<=sr[b])
            tr[c++]=sr[a++];
        else
        {
            tr[c++]=sr[b++];
            sum+=e1-a+1;
        }//求逆序对(在有序序列中若a[i]>a[j], 则a[i]后的元素皆大于a[j])
    }
     while(a<=e1)// 若第一段序列还没遍历完,将其剩余全部复制到合并序列
          tr[c++]=sr[a++];
     while(b<=e2)// 若第二段序列还没遍历完,将其剩余全部复制到合并序列
        tr[c++]=sr[b++];
     for(int i=s1;i<=e2;i++)// 将合并序列复制到原始序列中
        sr[i]=tr[i-s1];
}
void merge_sort(int s,int e)
{
    int m;
    if(s<e)
    {
        m=(s+e)/2;
        merge_sort(s,m);//左边有序;
        merge_sort(m+1,e);//右边有序;
        Merge(s,m,m+1,e);//合并两个有序序列;注意起始位置;
    }
}
int main()
{
    int n;
    sum=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&sr[i]);
    merge_sort(0,n-1);
    printf("%ld\n",sum);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509403.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gSoap客户端调用WebService完成后注意内存释放顺序

gSoap客户端调用WebService完成后注意内存释放顺序 [cpp] view plaincopy //Soap资源清理 soap_destroy(soap_sp.get()); //清理反序列化的类实例 soap_end(soap_sp.get()); //清理反序列化的数据 &#xff08;除类实例&#xff09; 和临时数据清理…

spring面向AOP之动态代理

动态代理中有两个重要的接口&#xff0c;一个是InvocationHandle&#xff0c;另一个是Proxy。 分别来说明这两个接口的作用吧&#xff01; InvocationHandle接口‘ java.lang.reflect.InvocationHandler InvocationHandler 是代理实例的调用处理程序 实现的接口。每个代理实…

数据结构实验之排序六:希尔排序

题目描述 我们已经学习了各种排序方法&#xff0c;知道在不同的情况下要选择不同的排序算法&#xff0c;以期达到最好的排序效率&#xff1b;对于待排序数据来说&#xff0c;若数据基本有序且记录较少时&#xff0c; 直接插入排序的效率是非常好的&#xff0c;希尔排序就是针对…

spring整合JDBC

文章目录spring提供了很多模板整合Dao技术spring中提供了一个可以操作数据库的对象.对象封装了jdbc技术.如何用Spring中的jdbc模板对数据库操作&#xff1a;spring配置进阶内容JDBCDaoSupport的使用spring提供了很多模板整合Dao技术 因为在jdbc、Hibernate、Mybatis中都有对数据…

稳定排序和不稳定排序

http://blog.csdn.net/rebirth_love/article/details/52354338 这几天笔试了好几次了&#xff0c;连续碰到一个关于常见排序算法稳定性判别的问题&#xff0c;往往还是多选&#xff0c;对于我以及和我一样拿不准的同学可不是一个能轻易下结论的题目&#xff0c;当然如果你笔试之…

spring中aop事务

文章目录事务为什要用到Spring中AOP事务事物的特性 ACID事务并发问题事务的隔离级别spring事务管理事务操作事务操作对象spring管理事务的属性介绍spring管理事务方式编码式xml配置(aop)注解配置Transactional注解在方法上添加Transactional注解在类上添加实际案例xml配置注入a…

Mybatis介绍、jdbc操作数据库原始写法以及Mybatis架构

文章目录Mybatis介绍jdbc操作数据库原生写法使用jdbc编程问题总结Mybatis架构Mybatis介绍 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code&#xff0c;并且改名为MyBatis 。2013年11月迁移到Github。 MyBatis是一个…

数据结构上机测试2-1:单链表操作A

题目描述 输入n个整数&#xff0c;先按照数据输入的顺序建立一个带头结点的单链表&#xff0c;再输入一个数据m,将单链表中的值为m的结点全部删除。分别输出建立的初始单链表和完成删除后的单链表。输入 第一行输入数据个数n&#xff1b;第二行依次输入n个整数&#xff1b;第三…

数据结构上机测试2-2:单链表操作B

题目描述 按照数据输入的相反顺序&#xff08;逆位序&#xff09;建立一个单链表&#xff0c;并将单链表中重复的元素删除&#xff08;值相同的元素只保留最后输入的一个&#xff09;。输入 第一行输入元素个数n&#xff1b;第二行输入n个整数。输出 第一行输出初始链表元素个数…

利用Mybatis写第一个数据库操作的程序

文章目录mybatis下载业务需求环境搭建加入配置文件创建pojosql映射文件加载映射文件实现根据id查询用户测试程序&#xff1a;效果mybatis下载 mybaits的代码由github.com管理 下载地址&#xff1a;https://github.com/mybatis/mybatis-3/releases 下载的mybatis文件如下&#…

数据结构实验之链表六:有序链表的建立

题目描述 输入N个无序的整数&#xff0c;建立一个有序链表&#xff0c;链表中的结点按照数值非降序排列&#xff0c;输出该有序链表。输入 第一行输入整数个数N&#xff1b;第二行输入N个无序的整数。输出 依次输出有序链表的结点值。示例输入 6 33 6 22 9 44 5 示例输出 5 6 9…

利用Mybatis对数据库进行增删改查操作

文章目录mybatis模糊查找先来了解一下 #{}和${}的使用parameterType和resultType的使用selectOne和selectList的使用mysql自增主键返回方法一&#xff1a;mysql的函数函数返回方法二&#xff1a;定义useGeneratedKeys为true返回Mysql使用 uuid实现主键看到UUID和自增长的id想必…

原始Dao开发方法以及存在的问题

存在的问题&#xff1a; 原始Dao开发中存在以下问题&#xff1a; 1.Dao方法体存在重复代码&#xff1a;通过SqlSessionFactory创建SqlSession&#xff0c;调用SqlSession的数据库操作方法 2.调用sqlSession的数据库操作方法需要指定statement的id&#xff0c;这里存在硬编码&am…

聚合和组合的关系

转自&#xff1a;http://www.blogjava.net/lukangping/archive/2010/08/01/327693.html 记得在当时学习uml总是不好分清聚合与组合的关系&#xff0c;找工作时特地复习了这块的内容&#xff0c;结果正巧被面试官问道&#xff0c;这两天又在搞这块的内容&#xff0c;对聚合与组合…

Message Flood

题目描述 Well, how do you feel about mobile phone? Your answer would probably be something like that "Its so convenient and benefits people a lot". However, If you ask Merlin this question on the New Years Eve, he will definitely answer "Wh…

关联和依赖的区别

最近研究设计模式&#xff0c;看类图有点发虚&#xff01;有些关系搞的不是很清楚。所以整理一下&#xff1a; 类与类之间由弱到强关系是: 没关系 > 依赖 > 关联 > 聚合 > 组合。 类和类之间八竿子打不着那就是没关系&#xff0c;这个没啥歧义。 依赖(dependenc…

Mybatis解决jdbc编程的问题以及mybatis与hibernate的不同

Mybatis解决jdbc编程的问题: 1、 数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能&#xff0c;如果使用数据库连接池可解决此问题。 解决&#xff1a;在SqlMapConfig.xml中配置数据连接池&#xff0c;使用连接池管理数据库链接。 2、 Sql语句写在代码中造成代码不…

C++继承详解:共有(public)继承,私有(private)继承,保护(protected)继承

转自&#xff1a;http://www.cnblogs.com/qlwy/archive/2011/08/25/2153584.html C继承&#xff1a;公有&#xff0c;私有&#xff0c;保护 公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。 1. 公有继承(public) 公有继承的特点是基类的公有成…

Mybatis中Mapper动态代理方式

文章目录开发规范Mapper接口开发需要遵循以下规范Mapper.xml(映射文件)UserMapper(接口文件)加载UserMapper.xml文件总结selectOne和selectList:namespace:开发规范 Mapper接口开发方法只需要程序员编写Mapper接口&#xff08;相当于Dao接口&#xff09;&#xff0c;由Mybatis…