博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试题36:数组中的逆序对
阅读量:5998 次
发布时间:2019-06-20

本文共 1451 字,大约阅读时间需要 4 分钟。

题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如,有一个数组为Array[0..n] 其中有元素a[i],a[j].如果 当i
a[j],那么我们就称(a[i],a[j])为一个逆序对。在数组{
7,5,6,4}中一共存在5对逆序对,分别是(7,6),(7,5),(7,4),(6,4),(5,4)。

参考文献

->归并排序

解题思路

看到这样的题目,最简单的想法就是遍历每一个元素,让其与后面的元素对比,如果大于则count++,但是这样的时间复杂度是o(n2)。这题有更好的解决方法,时间复杂度只需要o(nlogn)。其实这道题目的思路跟归并排序差不多,求逆序对的过程就是一个求归并排序的过程,在求出逆序对以后,原数组变得有序,是通过归并排序得到的。

(1)总体的意思就是将数组分成两段,首先求段内的逆序对数量,比如下面两段代码就是求左右两端数组段内的逆序对数量

inversions+=InversePairsCore(arry,start,mid,temp);//找左半段的逆序对数目inversions+=InversePairsCore(arry,mid+1,end,temp);//找右半段的逆序对数目

(2)然后求段间的逆序对数量,如下面的代码

inversions+=MergeArray(arry,start,mid,end,temp);//在找完左右半段逆序对以后两段数组有序,然后找两段之间的逆序对。最小的逆序段只有一个元素。

(3)然后在求段间逆序对的时候,我们分为arry[start...mid]和arry[mid+1...end],然后设置两个指针ij分别指向两段数组的末尾元素,也就是i=mid,j=end。然后比较arry[i]和arry[j],

  1. 如果arry[i]>arry[j],因为两段数组都是有序的,所以arry[i]>arry[mid+1...j],这些都是逆序对,我们统计出的逆序对为j-(mid+1)+1=j-mid。并且将大数arry[i]放入临时数组temp[]当中,i往前移动
  2. 如果arry[i]<arry[j],则将大数arry[j]放入temp[]中,j往前移。

完整实现代码

View Code

 输出结果:

调用MergeArray时的count:01 3 7 8 2 4 6 5调用MergeArray时的count:01 3 7 8 2 4 6 5调用MergeArray时的count:01 3 7 8 2 4 6 5调用MergeArray时的count:01 3 7 8 2 4 6 5调用MergeArray时的count:1//这是因为上面65之间有段内的逆序对1 3 7 8 2 4 5 6调用MergeArray时的count:01 3 7 8 2 4 5 6调用MergeArray时的count:9//这里全部都是段间的逆序对,(3,2),(7,2),(7,4),(7,5),(7,6),(8,2),(8,4),(8,5),(8,6),一共有九个1 2 3 4 5 6 7 8逆序对数量:10

 

 本文转自xwdreamer博客园博客,原文链接:http://www.cnblogs.com/xwdreamer/archive/2012/10/12/2721938.html,如需转载请自行联系原作者

你可能感兴趣的文章
深入学习jQuery自定义插件
查看>>
设计模式之适配器模式
查看>>
IDEA 字体设置(转)
查看>>
java无需解压zip压缩包直接读取包内的文件名(含中文)
查看>>
Testing - 软件测试知识梳理 - 理解测试
查看>>
L2TP/IPSec一键安装脚本
查看>>
android以json形式提交信息到服务器
查看>>
CetnOS 6.7安装Hive 1.2.1
查看>>
最短最优升级路径(完美世界2017秋招真题)
查看>>
【PHP基础】错误处理、异常处理
查看>>
Android之drawable state各个属性详解
查看>>
Linux——网段的划分,子网掩码,ABC类地址的表示法
查看>>
android开发(22)使用正则表达式 。从一个字符串中找出数字,多次匹配。
查看>>
AJAX
查看>>
2015 多校联赛 ——HDU5334(构造)
查看>>
几个ES6新特性
查看>>
mysql字符集
查看>>
DP_1d1d诗人小G
查看>>
非、半、结构化数据学习【转载】
查看>>
SpringMVC之单/多文件上传
查看>>