求逆序对数总结 & 归并排序
用归并排序方式
最原始的方法的复杂度是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 ...
随机推荐
- Struts1 生成Action请求的几种方式分析
1 直接硬编码 <a href="/Lesson14_Struts1_Demo1//user/regUserDo.do">注册</a><br/> ...
- Codeforces Round #325 (Div. 2) A
A. Alena's Schedule time limit per test 1 second memory limit per test 256 megabytes input standard ...
- 平面ray trace的数据结构加速
yy了一个数据结构.. 首先考虑到,平面ray trace对应的scene是planar graph with coordinates,特点是除端点外无相交. 我们考虑对所有端点建立kd-tree,注 ...
- Angular(二)
<!DOCTYPE html> <html lang="en" ng-app='myApp'> <head> <meta charset= ...
- js,将日期时分秒等格式化和转化
1.将js Date对象格式化为指定格式,添加一个原型方法 /** * 返回指定format的string * format eg:'yyyy-MM-dd hh:mm:ss' **/ Date.pro ...
- [ CodeVS冲杯之路 ] P3117
不充钱,你怎么AC? 题目:http://codevs.cn/problem/3117/ 啊啊啊,基础的高精度乘法被我写得又臭又长,以后再来优化代码(DP着哪天能够把加减乘除全部写一边贴上来,哦对还有 ...
- 飞扬的小鸟(NOIP2014)(丧病DP题)
原题传送门 刚开始我还以为这道题目非常的简单.. 然后随便打了一个DP,直接WA,被zxyer狠狠地D了一顿. 然后发现有好多细节.. 首先假如某横坐标没有管子,那么l[x]=0;h[x]=m+1; ...
- urllib url解析学习
#!/usr/bin/env python # encoding: utf-8 from urllib.parse import * #urlparse:解析url分段 #urlsplit:类似url ...
- kubernetes节点安装配置
#环境安装,要与控制节点一致Centos 7 Linux release 7.3.1611网络: 互通配置主机名设置各个服务器的主机名hosts#查找kubernetes支持的docker版本Kube ...
- java1.7集合源码阅读:ArrayList
ArrayList是jdk1.2开始新增的List实现,首先看看类定义: public class ArrayList<E> extends AbstractList<E> i ...