【概述】

设A为一个有n个数字的有序集,其中所有数字各不相同。如果存在整数i、j,使得1<=i<j<=n且A[i]>A[j],则{A[i],A[j]}这个有序对称为A的一个逆序对。

例如:集合{3,1,4,5,2}的逆序对有{3,1}、{3,2}、{4,2}、{5,2}共4个。

而逆序对问题,即:对给定的数组序列,求其逆序对的数量。

【分析】

从定义上分析,逆序对就是数列中任意两个数满足大的在前,小的在后的组合。如果将这些逆序对都调整为顺序,那么整个数列就变的有序,即排序。

因而容易想到冒泡排序的机制正好是利用消除逆序来实现的,也就是说,交换相邻两个逆序数,最终实现整个序列有序,那么交换的次数即为逆序对的数量。

但由于冒泡排序本身效率不高,时间复杂度为O(n^2),对于n较大的情况下不适用,因此我们用归并排序来解决逆序对问题。

【程序实现】

/*只需修改原有归并程序,当右边序列元素为较小值时,就统计其产生的逆序对数量,即可完成逆序对统计*/
void msort(int s,int t)
{if(s==t)//只有一个数字则返回return;int mid=(s+t)/2;msort(s,mid);//分解左序列msort(mid+1,t);//分解右序列int i=s,j=mid+1,k=s;while(i<=mid&&j<=t){if(a[i]<=a[j]){r[k]=a[j];k++;i++;}else{r[k]=a[j];k++;j++;ans+=mid-i+1;//统计产生逆序对的数量}}while(i<=mid){//复制左边子序列剩余r[k]=a[i];k++;i++;}while(j<=t){//复制右边子序列剩余r[k]=a[j];k++;j++;}for(i=s;i<=t;i++)a[i]=r[i];
}

理论基础 —— 排序 —— 逆序对问题相关推荐

  1. 【数据结构笔记32】排序算法概述、简单排序(冒泡排序、插入排序)、逆序对

    本次笔记内容: 9.1.1 概述 9.1.2 冒泡排序 9.1.3 插入排序 9.1.4 时间复杂度下界 文章目录 排序算法前提条件 冒泡排序 插入排序 时间复杂度下界 逆序对(inversion) ...

  2. 求逆序对数目(合并排序)

    7-2 求逆序对数目 (30分) 注意:本问题算法的时间复杂度要求为O(nlogn), 否则得分无效 题目来源:http://poj.org/problem?id=1804 Background Ra ...

  3. 【2018.12.15】【考试总结】【模拟+逆序对+树状数组+贪心+multiset】爆零之旅

    这是我悲惨的接近爆零的一次考试,但是本蒟蒻不能放弃,还是要总结的QAQ 答题卡 [题目背景] 八月是个悲惨的月份.先不谈炎热的天气,对于新生来说,八月意味着军训: 而对于高二高三的同学来说,八月意味着 ...

  4. szu 寒训第二天 树状数组 二维树状数组详解,以及树状数组扩展应用【求逆序对,以及动态第k小数】

    树状数组(Binary Index Tree) 树状数组可以解决可以转化为前缀和问题的问题 这是一类用以解决动态前缀和的问题 (有点像线段树简版) 1.对于 a1 + a2 + a3 + - + an ...

  5. Tido 习题-二叉树-树状数组求逆序对

    这里给大家提供一个全新的求逆序对的方法 是通过树状数组来实现的 题目描述   样例输入 Copy 5 2 3 1 5 4 样例输出 Copy 3 提示       #include<iostre ...

  6. C++求数组中的逆序对

    C++求数组中的逆序对. 如果在数组中的两个数字如果前面的一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数 #include<iostream> ...

  7. 利用归并排序求逆序对

    在逆序对的问题中,如果采用暴力求解的方法,一般也是有效的,但是O(n2)时间复杂度实在是难以接受的.但是对于逆序对问题,却有一个看似不想关的算法来解决–归并排序.时间复杂度和空间复杂度完全与归并排序一 ...

  8. 牛客(35)数组中的逆序对

    // 题目描述 // 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对. // 输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. ...

  9. python 归并排序,合并有序数组,逆序对个数

    归并排序,合并有序列表,求逆序对个数 之所以将标题中三者放一起是因为它们有密不可分的关系. 合并有序列表 定义一个空列表 li 用来存放排序后的值; 定义两个 cursor lc 和 rc,分别指向左 ...

最新文章

  1. Hadoop文件系统元数据fsimage和编辑日志edits
  2. 一个简单可参考的API网关架构设计
  3. python教程:getattr函数和hasattr函数的用法
  4. VS2010开发ribbon风格的程序
  5. 微软VDI动手实验之应用模型及部署攻略
  6. 廖雪峰mysql安装教程 pdf_使用MySQL - 廖雪峰 Python 3 教程
  7. SAP License:获利分析的两种方式比较
  8. Windows Server 林功能级别详解
  9. 怎样为深度学习系统选择GPU
  10. java实现阴历、阳历互相转换
  11. GC root 解决了循环引用的垃圾回收问题
  12. {errcode:40125,errmsg:invalid appsecret, view more at http:\/\/t.cn\/RAEkdVq, hints: [ req_id:
  13. C++高阶 什么是Trivial types?
  14. 360董事长周鸿祎:网络攻击损害不亚于杀伤性武器
  15. 改进Zhang Suen细化算法的C#实现
  16. 2022Java面试题大全(整理版)面试题附答案详解,最全面详细
  17. 柏林水厂资产管理RFID跟踪管理系统应用
  18. 面向对象分割:结合eCognition与python
  19. uni-app支付相关配置和代码(H5+APP+小程序+requestPayment service fail not found报错)
  20. 第1章 android发展史

热门文章

  1. 一文看懂用Python读取Excel数据
  2. 为什么你跟高手有差距?因为他们会在假期里读这5本书
  3. 在python中字典和集合都是用一对什么作为界定符_Python习题(一)
  4. 应用上云2小时烧掉近50万,创始人:差点破产,简直噩梦
  5. 漫话:为什么程序员喜欢使用0 ≤ i 10这种左闭右开的形式写for循环?
  6. SpringBoot 2.x ShardingSphere分库分表实战
  7. 李猛:从MongoDB迁移到ES后,我们减少了80%的服务器
  8. Linux多线程实践(2) --线程基本API
  9. vue 实现横向时间轴
  10. [2019人工智能实战_廖盈嘉]第1次个人作业