求逆序对数总结 & 归并排序
用归并排序方式
最原始的方法的复杂度是O(n^2)。
使用归并排序的方式,可以把复杂度降低到O(nlgn).
设A[1..n]是一个包含N个非负整数的数组。如果在i〈 j的情况下,有A〉A[j],则(i,j)就称为A中的一个逆序对。
例如,数组(3,1,4,5,2)的“逆序对”有<3,1>,<3,2><4,2><5,2>,共4个。
注:我觉得方法是在归并过程中,记录每次归并,后面的分组中被放到了前面的元素的个数。
的确是这样的。下面这个也是MergeSort的基本算法框架:
int gCount = ;
template<class Iterator>int merge(Iterator begin, Iterator mid, Iterator end)
{
Iterator iL = begin;
Iterator iR = mid;
int count = distance(begin, end);
vector<int> v(count);
vector<int>::iterator it = v.begin();
while(iL != mid && iR != end)
{
if(*iL <= * iR)
{
*it++ = *iL++;
}
else
{
gCount += distance(iL, mid);
*it++ = *iR++;
}
}
if(iL == mid) copy(iR, end, it);
if(iR == end) copy(iL, mid, it);
copy(v.begin(), v.end(), begin);
return ;
}
template<class Iterator>int mergeSort(Iterator begin, Iterator end)
{
int count, step;
count = distance(begin, end);
if(count <= )
{
return ;
}
step = count / ;
mergeSort(begin, begin + step);
mergeSort(begin + step, end);
merge(begin, begin + step, end);
return ;
}
重点在 gCount += distance(iL, mid) (注:distance其实就是位置的减法)
逆序对数实质就是插入排序过程中要移动元素的次数。
要移动的元素的位数即第一个序列中还未插入到新序列中的元素的个数
即: distance(iL, mid)
求逆序对数总结 & 归并排序的更多相关文章
- 归并排序(归并排序求逆序对数)--16--归并排序--Leetcode面试题51.数组中的逆序对
面试题51. 数组中的逆序对 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4] 输出 ...
- hdu 4911 求逆序对数+树状数组
http://acm.hdu.edu.cn/showproblem.php?pid=4911 给定一个序列,有k次机会交换相邻两个位置的数,问说最后序列的逆序对数最少为多少. 实际上每交换一次能且只能 ...
- poj 2299 树状数组求逆序对数+离散化
Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 54883 Accepted: 20184 ...
- 算法笔记_065:分治法求逆序对(Java)
目录 1 问题描述 2 解决方案 2.1 蛮力法 2.2 分治法(归并排序) 1 问题描述 给定一个随机数数组,求取这个数组中的逆序对总个数.要求时间效率尽可能高. 那么,何为逆序对? 引用自百度 ...
- codeforces 459D D. Pashmak and Parmida's problem(离散化+线段树或树状数组求逆序对)
题目链接: D. Pashmak and Parmida's problem time limit per test 3 seconds memory limit per test 256 megab ...
- java实现求逆序对
1 问题描述 给定一个随机数数组,求取这个数组中的逆序对总个数.要求时间效率尽可能高. 那么,何为逆序对? 引用自百度百科: 设 A 为一个有 n 个数字的有序集 (n>1),其中所有数字各不相 ...
- codeforces 540E 离散化技巧+线段树/树状数组求逆序对
传送门:https://codeforces.com/contest/540/problem/E 题意: 有一段无限长的序列,有n次交换,每次将u位置的元素和v位置的元素交换,问n次交换后这个序列的逆 ...
- HDU 3743 Frosh Week(归并排序求逆序对)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3743 题目意思就是给你一个长为n的序列,让你求逆序对.我用的是归并排序来求的.归并排序有一个合并的过程 ...
- 浙江工商大学15年校赛I题 Inversion 【归并排序求逆序对】
Inversion Time Limit 1s Memory Limit 131072KB Judge Program Standard Ratio(Solve/Submit) 15.00%(3/20 ...
随机推荐
- 雅礼集训 Day1 T1 养花
养花 题目描述 小\(C\)在家种了\(n\)盆花,每盆花有一个艳丽度\(a_i\). 在接下来的\(m\)天中,每天早晨他会从一段编号连续的花中选择一盆摆放在客厅, 并在晚上放回. 同时每天有特定的 ...
- 3.Docker与LXC、虚拟化技术的区别——虚拟化技术本质上是在模拟硬件,Docker底层是LXC,本质都是cgroups是在直接操作硬件
先说和虚拟化技术的区别 难道虚拟技术就做不到吗? 不不不,虚拟技术也可以做到,但是会有一定程度的性能损失,灵活度也会下降.容器技术不是模仿硬件层次,而是 在Linux内核里使用cgroup和names ...
- tips 前端 各个设备的页面尺寸的media query 与页面高度的经验总结
有段时间 扑了一个多月的在一个wifi的前端项目上 快做完时 各种小问题一堆一堆的修复 处理了一些很零散的问题 因为页面有一个所有页面都有一个背景色 有的页面有背景图 主要重点是移动前端的方向 因为现 ...
- Hidden (NOIP模拟赛)(字符串模拟QAQ)
原题传送门 神奇的题目诶 原来以为字符串比较一定要O(NlogN) 结果发现可以均摊O(N) 首先我们来讲一讲原理 我们有3个指针i,j,k i=0,j=1,k=0 一开始我们不断对k+1直到找到ch ...
- tomcat 异常:Caused by: org.apache.catalina.LifecycleException: The connector cannot start since the specified port value of [-1] is invalid
启动tomcat时出现异常: org.apache.catalina.LifecycleException: Failed to start component [Connector[AJP/1.3- ...
- flask的orm框架(SQLAlchemy)-创建表
# 转载请留言联系 ORM 是什么? ORM,Object-Relation Mapping.意思就是对象-关系映射.ORM 主要实现模型对象到关系数据库数据的映射. 优点 : 只需要面向对象编程, ...
- Javascript"怪异"现象
下面给大家看个例子,这个毫无疑问打印出10 var a = 10; function test() { console.log(a); } test(); 下面我改动一下 var a = 10; fu ...
- 2018年最重要的HTML5开发手册,传播正能量
今天给大家推荐这个HTML5开发手册,希望能帮助正在学习web前端的人,鄙人也是刚学习前端没多久,借助于一点资讯平台能够结识更多前端大牛,这是我的web前端/HTML5/javscript技术学习群: ...
- ()C# DataRow
判断某列是否存在,返回bool dr.Table.Columns.Contains("水分含量")
- C# 查看本机安装的NET Framework 版本
https://docs.microsoft.com/zh-cn/dotnet/framework/migration-guide/how-to-determine-which-versions-ar ...