逆序数求解(归并排序思想)

最近遇到求解逆序数的问题,题目如下:

问题描述:

A为一个有n个数字的有序集 (1<=n<=1e5),其中所有数字各不相同。
当存在正整数 i, j 使得 1 ≤ i < j ≤ n 而且 A[i] > A[j],则 <A[i], A[j]> 这个有序对称为 A 的一个逆序对,也称作逆序数。
请问序列A中的逆序对有多少个。

输入

第一行,序列长度n。(1<=n<=1e5)
第二行,序列a[1]…a[n]。(a[i]<1e8)

输出

逆序对个数。

样例输入

5
5 4 3 2 1

样例输出

10

思路

直接暴力求解,时间复杂度为O(n2),算法时间复杂度较大。可以考虑分治思想,运用二路归并排序的思想,将要求解的序列分成两段序列,我们假设这两段序列有序且内部的逆序数已经求出,现在需要解决的问题是两段序列之间的逆序数。在两段序列内部设置两个变量i,j(类似于归并排序),对于前一段中每一个数字,当i指向的数字比j指向的数字大时,都有逆序数r-j+1个逆序数,循环排序并累计,最终的结果即为所求。详情见代码

代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef long long ll;  \\数据规模可能较大,注意开long long,

ll count(int p[],int l, int mid, int r) {
   
	int i = l, j = mid, len = r - l + 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值