理论基础 —— 排序 —— 逆序对问题
【概述】
设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];
}
理论基础 —— 排序 —— 逆序对问题相关推荐
- 【数据结构笔记32】排序算法概述、简单排序(冒泡排序、插入排序)、逆序对
本次笔记内容: 9.1.1 概述 9.1.2 冒泡排序 9.1.3 插入排序 9.1.4 时间复杂度下界 文章目录 排序算法前提条件 冒泡排序 插入排序 时间复杂度下界 逆序对(inversion) ...
- 求逆序对数目(合并排序)
7-2 求逆序对数目 (30分) 注意:本问题算法的时间复杂度要求为O(nlogn), 否则得分无效 题目来源:http://poj.org/problem?id=1804 Background Ra ...
- 【2018.12.15】【考试总结】【模拟+逆序对+树状数组+贪心+multiset】爆零之旅
这是我悲惨的接近爆零的一次考试,但是本蒟蒻不能放弃,还是要总结的QAQ 答题卡 [题目背景] 八月是个悲惨的月份.先不谈炎热的天气,对于新生来说,八月意味着军训: 而对于高二高三的同学来说,八月意味着 ...
- szu 寒训第二天 树状数组 二维树状数组详解,以及树状数组扩展应用【求逆序对,以及动态第k小数】
树状数组(Binary Index Tree) 树状数组可以解决可以转化为前缀和问题的问题 这是一类用以解决动态前缀和的问题 (有点像线段树简版) 1.对于 a1 + a2 + a3 + - + an ...
- Tido 习题-二叉树-树状数组求逆序对
这里给大家提供一个全新的求逆序对的方法 是通过树状数组来实现的 题目描述 样例输入 Copy 5 2 3 1 5 4 样例输出 Copy 3 提示 #include<iostre ...
- C++求数组中的逆序对
C++求数组中的逆序对. 如果在数组中的两个数字如果前面的一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数 #include<iostream> ...
- 利用归并排序求逆序对
在逆序对的问题中,如果采用暴力求解的方法,一般也是有效的,但是O(n2)时间复杂度实在是难以接受的.但是对于逆序对问题,却有一个看似不想关的算法来解决–归并排序.时间复杂度和空间复杂度完全与归并排序一 ...
- 牛客(35)数组中的逆序对
// 题目描述 // 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对. // 输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. ...
- python 归并排序,合并有序数组,逆序对个数
归并排序,合并有序列表,求逆序对个数 之所以将标题中三者放一起是因为它们有密不可分的关系. 合并有序列表 定义一个空列表 li 用来存放排序后的值; 定义两个 cursor lc 和 rc,分别指向左 ...
最新文章
- Hadoop文件系统元数据fsimage和编辑日志edits
- 一个简单可参考的API网关架构设计
- python教程:getattr函数和hasattr函数的用法
- VS2010开发ribbon风格的程序
- 微软VDI动手实验之应用模型及部署攻略
- 廖雪峰mysql安装教程 pdf_使用MySQL - 廖雪峰 Python 3 教程
- SAP License:获利分析的两种方式比较
- Windows Server 林功能级别详解
- 怎样为深度学习系统选择GPU
- java实现阴历、阳历互相转换
- GC root 解决了循环引用的垃圾回收问题
- {errcode:40125,errmsg:invalid appsecret, view more at http:\/\/t.cn\/RAEkdVq, hints: [ req_id:
- C++高阶 什么是Trivial types?
- 360董事长周鸿祎:网络攻击损害不亚于杀伤性武器
- 改进Zhang Suen细化算法的C#实现
- 2022Java面试题大全(整理版)面试题附答案详解,最全面详细
- 柏林水厂资产管理RFID跟踪管理系统应用
- 面向对象分割:结合eCognition与python
- uni-app支付相关配置和代码(H5+APP+小程序+requestPayment service fail not found报错)
- 第1章 android发展史
热门文章
- 一文看懂用Python读取Excel数据
- 为什么你跟高手有差距?因为他们会在假期里读这5本书
- 在python中字典和集合都是用一对什么作为界定符_Python习题(一)
- 应用上云2小时烧掉近50万,创始人:差点破产,简直噩梦
- 漫话:为什么程序员喜欢使用0 ≤ i 10这种左闭右开的形式写for循环?
- SpringBoot 2.x ShardingSphere分库分表实战
- 李猛:从MongoDB迁移到ES后,我们减少了80%的服务器
- Linux多线程实践(2) --线程基本API
- vue 实现横向时间轴
- [2019人工智能实战_廖盈嘉]第1次个人作业