算法导论习题---求n个元素任何排列中逆序对的数量

本文详细介绍了如何通过归并排序算法在Θ(nlgn)的时间复杂度内计算数组排列中的逆序对数量。首先解释了逆序对的定义,然后探讨了三种方法,包括直接遍历(时间复杂度O(n^2))、插入排序(同样为O(n^2))以及优化的归并排序方法(O(nlgn))。重点讲述了归并排序在计算逆序对时的思路,即在合并过程中动态统计逆序对数量。
摘要由CSDN通过智能技术生成

问题描述:

设A[1…n]是一个包含n个不同数的数组。如果在i < j的情况下,有A[i] > A[j],则(i,j)就称为A中的一个逆序对(inversion),(逆序对的元素是下标,而不是数组里的值)。给出一个算法,它能用Θ(nlgn)的最坏情况运行时间,确定n个元素的任何排列中逆序对的数目。

问题求解:

方法一:
循环从数组中取出一个元素k,然后从k之后的元素中找到比k小的元素个数,最后统计所有的个数即为排列中逆序对的数目。从数组中取元素的次数为n,每次取出一个元素后,需要遍历(n-i)次(i为当前元素的位置),其时间复杂度为
这里写图片描述
算法实现:

int CountInversions(const vector<int>& a)
{
    int cnt = 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值