[算法导论]练习2-4.d求排列中逆序对的数量
转载请注明:http://www.cnblogs.com/StartoverX/p/4283186.html
题目:给出一个确定在n个不同元素的任何排列中逆序对数量的算法,最坏情况需要Θ(nlgn)时间。(提示:修改归并排序。)
思路:修改从大到小排序的归并排序。
归并排序分为三步:分解、解决、合并。
分解:将排列A分解为A1、A2两个子排列。
解决:递归的从大到小排列A1和A2,在此同样递归的求解A1、A2的逆序对数量。
合并:按照递归排序的合并策略从大到小比较A1中的元素[a1,a2,a3…]和A2中的元素[b1,b2,b3…]。
1.若a1大于b1,则a1大于A2中的所有元素,逆序对的数量加上length(A2),将a1从A1中移至输出排列,a2继续与b1比较。
2.若a1小于b1,则b1大于A1中的所有元素,b1不能与A1中的元素构成逆序对,将b1从A2中移至输出排列,b2继续与a1比较。
3.直到A1或A2中没有元素,将剩余元素移至输出排列。
合并后的逆序对的数目为合并前A1和A2中逆序对的数目之和加上合并过程中加上的逆序对数。
#include<iostream>
using namespace std; int A[];
int temp1[];
int temp2[];
int merge(int low1,int high1,int low2,int high2){//合并步
int inver_num=;//合并中新增的逆序对数目。
int A_pos=low1;
int size1=;//首先将两个待合并数组复制到临时数组中。
while(low1<=high1){
temp1[size1++]=A[low1++];
}
int size2=;
while(low2<=high2){
temp2[size2++]=A[low2++];
}
int i=,j=;
while(size1!=&&size2!=){//开始合并
if(temp1[i]>temp2[j]){
A[A_pos++]=temp1[i++];
inver_num+=size2;//逆序对数目增加。
size1-=;
}
else{//没有相同元素。
A[A_pos++]=temp2[j++];
size2-=;
}
} while(size2!=){//将剩余的元素复制到输出数组。
A[A_pos++]=temp2[j++];
size2-=;
}
while(size1!=){//和上面的while只会执行一个。
A[A_pos++]=temp1[i++];
size1-=;
}
return inver_num;
}
int inversion(int low,int high){
if(low>=high)
return ;
int mid=(low+high)/;
int left_num=inversion(low,mid);
int right_num=inversion(mid+,high);
int merge_num=merge(low,mid,mid+,high);
return left_num+right_num+merge_num;
} int main(){
int size;
cin>>size;//输入数组大小。
for(int i=;i<size;i++){//输入数组。
cin>>A[i];
}
cout<<inversion(,size-)<<endl;
}
[算法导论]练习2-4.d求排列中逆序对的数量的更多相关文章
- 求数组中的逆序对的数量----剑指offer36题
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数: 如数组{7,5,6,4},逆序对总共有5对,{7,5},{7,6},{7, ...
- openjudge 7622 求排列的逆序数(归并)
7622:求排列的逆序数 总时间限制: 1000ms 内存限制: 65536kB 描述 在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计他(或她) ...
- XJTUOJ wmq的队伍(树状数组求 K 元逆序对)
题目链接:http://oj.xjtuacm.com/problem/14/[分析]二元的逆序对应该都会求,可以用树状数组.这个题要求K元,我们可以看成二元的.我们先从后往前求二元逆序对数, 然后对于 ...
- 算法导论学习之线性时间求第k小元素+堆思想求前k大元素
对于曾经,假设要我求第k小元素.或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,可是如今有了更好的思路. 一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法. 其详细的分治思 ...
- 算法导论2-4 O(nlgn)时间复杂度求逆序对
def mergesort(nums,le,ri): if le>ri-2: return 0 mi=le+(ri-le)//2 a=mergesort(nums,le,mi) b=merges ...
- 洛谷 P1521 求逆序对
题目描述 我们说(i,j)是a1,a2,…,aN的一个逆序对当且仅当i<j且ai>a j.例如2,4,1,3,5的逆序对有3个,分别为(1,3),(2,3),(2,4).现在已知N和K,求 ...
- 归并排序求逆序对(poj 2299)
归并排序求逆序对 题目大意 给你多个序列,让你求出每个序列中逆序对的数量. 输入:每组数据以一个数 n 开头,以下n行,每行一个数字,代表这个序列: 输出:对于输出对应该组数据的逆序对的数量: 顺便在 ...
- 笔试算法题(32):归并算法求逆序对 & 将数组元素转换为数组中剩下的其他元素的乘积
出题:多人按照从低到高排成一个前后队列,如果前面的人比后面的高就认为是一个错误对: 例如:[176,178,180,170,171]中的错误对 为 <176,170>, <176,1 ...
- 浙江工商大学15年校赛I题 Inversion 【归并排序求逆序对】
Inversion Time Limit 1s Memory Limit 131072KB Judge Program Standard Ratio(Solve/Submit) 15.00%(3/20 ...
随机推荐
- document.readystate
http://www.cnblogs.com/lhb25/archive/2009/07/30/1535420.html http://www.cnblogs.com/haogj/archive/20 ...
- NGINX当中的SSL配置(PEM启动密码免输入)
干过的都懂,这个东东好像很碍事. 很影响RELOAD的效率...并且,,,好像这个弄了之后,NGINX作RELOAD之后,可以即时更新配置了..(还是说那个DVROOT.CER影响的??未考证) ht ...
- CPU卡中T=0通讯协议的分析与实现
IC卡的应用越来越广泛,从存储卡到逻辑加密卡,目前CPU卡已经逐渐在应用中占据主导地位.CPU卡根据通讯协议可分为两种:接触式和非接触式.接触式CPU卡主要采用两种通讯协议:T=0和T=1通讯协议.T ...
- 初识Mybatis框架,实现增删改查等操作
此第一次接触Mybatis框架确实是有点不适应,特别是刚从Hibernate框架转转型过来,那么为什么要使用Mybatis框架,Mybatis框架和Hibernate框架又有什么异同呢? 这个问题在我 ...
- 关于group by
<pre name="code" class="sql">关于group by 排序问题 10g 以前sort group by 需要排序 10g ...
- C(m,n)%P
program1 n!%P(P为质数) 我们发现n! mod P的计算过程是以P为周期的的,举例如下: n = 10, P = 3 n! = 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 ...
- Lambda 表达式的示例-来源(MSDN)
本文演示如何在你的程序中使用 lambda 表达式. 有关 lambda 表达式的概述,请参阅 C++ 中的 Lambda 表达式. 有关 lambda 表达式结构的详细信息,请参阅 Lambda 表 ...
- 【hihoCoder第十六周】RMQ-ST算法
RMQ的大裸题.没什么意思.开始数组开小了,RE了一次.下面放代码. #include <bits/stdc++.h> using namespace std; vector<int ...
- oracle10.2 dblink impd 同库不同用户复制数据
同库不同用户复制数据 1.授权用户导入表权限; SQL> grant exp_full_database to system; SQL> commit; 2.创建dblink; SQL&g ...
- testlink 下载地址
testlink 下载地址 https://sourceforge.net/projects/testlink/files/TestLink%201.9/