首页 > 编程语言 > 详细

POJ2299 求逆序对总数 归并算法解决

时间:2015-09-18 15:36:58      阅读:186      评论:0      收藏:0      [点我收藏+]

逆序对 比如 3 2 1  

3之前的数没有比它大的(或者说前面没有数了),所以没有逆序对

2之前的数有3比它大 所以有逆序对+1

1之前的数有 3 2 比它大 所以有逆序对+2

所以 3 2 1 序列 的 总的逆序对为3对

-----

在归并算法中 合并两个已经排序好的序列时 是从两个序列的首个位置开始进行比较

合并方法传入的参数为:first mid(分界下标) last

第一个序列下标:first ~ mid

第二个序列下标:mid + 1 ~ last

1.如果a[i] <= a[j]  显然 不存在 逆序对

2.如果a[i]>a[j] 显然 存在逆序对,此时,既然a[i]>a[j] 那么i后面的下标(i+1~mid)对应的数a[i]也绝对大于a[j] 所以存在逆序对(mid - i + 1)(包括a[i]在内的数以及后面的数都大于a[j],逆序对就为mid-i+1对)

经过归并排序之后,累加的逆序对数就是整个序列的总的逆序对数 即 答案

【注意】

由于输入的序列长度最大为500000 且每个数可达到999999999,所以累加逆序对数的变量最好用long long数据类型

 

POJ2299 求逆序对总数 归并算法解决

原文:http://www.cnblogs.com/ZimSionLi/p/4819235.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!