转载请注明: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中逆序对的数目之和加上合并过程中加上的逆序对数。

  1. #include<iostream>
  2. using namespace std;
  3.  
  4. int A[];
  5. int temp1[];
  6. int temp2[];
  7. int merge(int low1,int high1,int low2,int high2){//合并步
  8. int inver_num=;//合并中新增的逆序对数目。
  9. int A_pos=low1;
  10. int size1=;//首先将两个待合并数组复制到临时数组中。
  11. while(low1<=high1){
  12. temp1[size1++]=A[low1++];
  13. }
  14. int size2=;
  15. while(low2<=high2){
  16. temp2[size2++]=A[low2++];
  17. }
  18. int i=,j=;
  19. while(size1!=&&size2!=){//开始合并
  20. if(temp1[i]>temp2[j]){
  21. A[A_pos++]=temp1[i++];
  22. inver_num+=size2;//逆序对数目增加。
  23. size1-=;
  24. }
  25. else{//没有相同元素。
  26. A[A_pos++]=temp2[j++];
  27. size2-=;
  28. }
  29. }
  30.  
  31. while(size2!=){//将剩余的元素复制到输出数组。
  32. A[A_pos++]=temp2[j++];
  33. size2-=;
  34. }
  35. while(size1!=){//和上面的while只会执行一个。
  36. A[A_pos++]=temp1[i++];
  37. size1-=;
  38. }
  39. return inver_num;
  40. }
  41. int inversion(int low,int high){
  42. if(low>=high)
  43. return ;
  44. int mid=(low+high)/;
  45. int left_num=inversion(low,mid);
  46. int right_num=inversion(mid+,high);
  47. int merge_num=merge(low,mid,mid+,high);
  48. return left_num+right_num+merge_num;
  49. }
  50.  
  51. int main(){
  52. int size;
  53. cin>>size;//输入数组大小。
  54. for(int i=;i<size;i++){//输入数组。
  55. cin>>A[i];
  56. }
  57. cout<<inversion(,size-)<<endl;
  58. }

[算法导论]练习2-4.d求排列中逆序对的数量的更多相关文章

  1. 求数组中的逆序对的数量----剑指offer36题

    在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数: 如数组{7,5,6,4},逆序对总共有5对,{7,5},{7,6},{7, ...

  2. openjudge 7622 求排列的逆序数(归并)

    7622:求排列的逆序数 总时间限制:  1000ms   内存限制:  65536kB 描述 在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计他(或她) ...

  3. XJTUOJ wmq的队伍(树状数组求 K 元逆序对)

    题目链接:http://oj.xjtuacm.com/problem/14/[分析]二元的逆序对应该都会求,可以用树状数组.这个题要求K元,我们可以看成二元的.我们先从后往前求二元逆序对数, 然后对于 ...

  4. 算法导论学习之线性时间求第k小元素+堆思想求前k大元素

    对于曾经,假设要我求第k小元素.或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,可是如今有了更好的思路. 一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法. 其详细的分治思 ...

  5. 算法导论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 ...

  6. 洛谷 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,求 ...

  7. 归并排序求逆序对(poj 2299)

    归并排序求逆序对 题目大意 给你多个序列,让你求出每个序列中逆序对的数量. 输入:每组数据以一个数 n 开头,以下n行,每行一个数字,代表这个序列: 输出:对于输出对应该组数据的逆序对的数量: 顺便在 ...

  8. 笔试算法题(32):归并算法求逆序对 & 将数组元素转换为数组中剩下的其他元素的乘积

    出题:多人按照从低到高排成一个前后队列,如果前面的人比后面的高就认为是一个错误对: 例如:[176,178,180,170,171]中的错误对 为 <176,170>, <176,1 ...

  9. 浙江工商大学15年校赛I题 Inversion 【归并排序求逆序对】

    Inversion Time Limit 1s Memory Limit 131072KB Judge Program Standard Ratio(Solve/Submit) 15.00%(3/20 ...

随机推荐

  1. C语言初学 计算表达式的值 switch的意义

    #include<stdio.h> main() { int a; printf("请输入一个数字\n"); scanf("%d",&a); ...

  2. 记录使用Hibernate查询bean中字段和数据库列类型不匹配问题

    今天在工程中遇到Hibernate查询的时候,bean中的字段和数据库中的字段不符合(bean中有pageTime字段,但是数据库中没有此列)报错问题. 具体问题环境: 在auto_off表中,off ...

  3. Baidu百度搜索引擎登录网站 - Blog透视镜

    Baidu百度是中国的搜索引擎,有心经营中国市场的网友,自然不能错过,不过Google谷歌已经遭中国封锁,如果你的网站是用Blogger架设的,具有blogspot.com网域的,则会无法浏览. 阅读 ...

  4. Ubuntu下配置使用maven

    下载界面: http://maven.apache.org/download.cgi 当前下载:apache-maven-3.2.5-bin.zip 解压到:/usr/lib/jvm/apache-m ...

  5. 【转】使用 vim + ctags + cscope + taglist 阅读源码

    原文网址:http://my.oschina.net/u/554995/blog/59927 最近,准备跟学长一起往 linux kernel 的门里瞧瞧里面的世界,虽然我们知道门就在那,但我们还得找 ...

  6. (2.1)servlet线程安全问题

    本文参考链接:http://www.yesky.com/334/1951334.shtml 摘 要:介绍了Servlet多线程机制,通过一个实例并结合Java 的内存模型说明引起Servlet线程不安 ...

  7. xdu_RainAndBow 鞍山打铁记

    我们作为弱校xdu的七队(大四一支,大三四支,大二俩),本来都没指望今年可以出去,结果运气不错,学校得到几个激动名额, 于是我们激动地成功申请到了鞍山站的名额,嗯...可以出去旅游了. 不过我们毕竟太 ...

  8. Windows系统结构

    四种用户模式进程:1.系统支持进程,比如登录进程和会话管理器,并不是Windows服务,不有服务控制管理器启动2.服务进程,一些以Windows服务方式来运行的组件3.用户应用进程4.环境子系统服务器 ...

  9. PhoneGap 和 PhoneGap Build 是什么?

    PhoneGap是目前唯一支持7种平台的开源移动开发框架,支持的平台包括iOS.Android.BlackBerry OS.Palm WebOS.Windows Phone 7.Symbian和Bad ...

  10. 一起talk C栗子吧(第二十回:C语言实例--括号匹配)

    各位看官们,大家好.前几回中咱们说了堆栈的原理,而且举了实际的样例进行讲解,这一回咱们说的例 子是:括号匹配. 括号匹配使用了堆栈的原理,大家能够从样例看出来.所以我们把它们放在一起.闲话 休提.言归 ...