算法学习笔记----确定n个元素的任何排列中逆序对的数目

这篇博客探讨了如何在Θ(nlgn)的时间复杂度内计算n个元素排列中的逆序对数。作者首先介绍了直接遍历和插入排序的解决方案,但由于它们的时间复杂度为Θ(n^2),不满足题目要求。接着,作者提出利用归并排序的递归特性,通过分治策略计算逆序对,这种方法的时间复杂度为Θ(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为当前元素的位置),其时间复杂度为:


  时间复杂度为Θ(n^2),不符合题目要求。

  ②利用插入排序的方式来解决。对数组用插入排序来做升序排列时,如果有元素需要移动,则每次移动时都相当于是找到了一个逆序对,因此插入队列中移动元素的次数,也就是排列中逆序对的数量。但插入排序的时间复杂度为Θ(n^2),不符合题目要求。

  ③利用归并排序的递归思想来解决,首先对数组的从中间分开,然后分别计算左半部和右半部的逆序对数,假设和为S,最后在合并过程中如果左半部的元素小于右半部的元素,则相当于是找到了一个逆序对,假设合并时找到的逆序对数为S',则总的逆序对数位S+S

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值