码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-09-18 15:40:15      阅读:152      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!