永发信息网

C或C++排序工作量

答案:1  悬赏:0  手机版
解决时间 2021-05-09 12:03
Sort公司是一个专门为人们提供排序服务的公司,该公司的宗旨是:“顺序是最美丽的”。他们的工作是通过一系列移动,将某些物品按顺序摆好。他们的服务是通过工作量来计算的,即移动东西的次数。所以,在工作前必须先考察工作量,以便向用户提出收费数目。
用户并不需要知道精确的移动次数,实质上,大多数人都是凭感觉来认定这一列物品的混乱程度,根据Sort公司的经验,人们一般是根据“逆序对”的数目多少来称呼这一序列的混乱程度。假设我们将序列中第I件物品的参数定义为A[I],那么,排序就是指将A数组从小到大排序。所谓“逆序对”是指目前A[1..N]中元素各不相同,若IA[j],则[I,J]就为一个“逆序对”。
例如,数组<3,1,4,5,2>的“逆序对”有<3,1>,<3,2>,<4,2>,<5,2>,共4个(如图1所示)。
  请你为Sort公司做一个程序,在尽量短的时间内,统计出“逆序对”的数目。

输入:

输入的第一行为一个整数N(1<=N<=10000),第二行为N个实数。

输出

  输出共一行,为“逆序对”的数目。

样例输入

5 3 1 4 5 2

样例输出

4

最佳答案

这题用分治法来做:将数组分为左右两部分,先计算左子数组中的逆序对数量,再计算右子数组中的逆序对数量,最后计算跨左,右子数组的逆序对数量,三个数量的和就是结果。


这里面最关键一步就是如何求跨左右子数组的逆序对数量。建议使用归并排序对子数组进行排序。这样我们就可以方便地计算逆序对数目了,步骤如下:


1。设左子数组为 l_array[ l_len ] , 右子数组为r_array[r_len]


2。变量i从左子数组左边开始遍历,j从右子数组左边开始遍历。


3. 对于l_array[i] , 找到第一个j,使得 r_array[j] > l_array[i] , 这既是第一个逆序对,由于r_array数组是有序的,所以r_array在j后面的元素也都和l_array[i] 构成逆序对。因此,对于l_array[i], 在右数组能找到的逆序对为 r_len - j 个。


4。找到 l_array[i]所有的逆序对后,i++。此时j无需从0开始遍历,只需要从当前位置开始遍历。重复第3步。


5。算法结束条件:i == l_len || j == r_len


按这个算法,寻找跨左右子数组的逆序对只需要i和j遍历完即可。时间代价为O(n), 因此整个算法时间代价和归并排序的时间代价相同。都是nlogn


代码就先不提供了,因为递归和归并排序的代码都是书上有的。你要做的只是按我上面说的思路修改一下这两个基础算法。有不明白的地方再问。

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
QQ飞车王者之翼好不好
为什么爱上一个要那么累
炫舞中CDKEY什么意思?
手机ppt.S60下载
用什么能开更多的业务?
逍遥津一战,真实历史上张辽和孙权分别带了多
求刘心以及 打扰一下组合 的所有的歌 和下载
1Q币等于多少Q点哦
如果俩个人彼此喜欢但是要分手了, 说什么能
问问要几级那图标才能点亮
利康老年公寓这个地址在什么地方,我要处理点
我的另一半现在出现了吗,我以后的事业怎么样
什么龙眼肉,龙眼核
济南有哪些服装厂是做整件的?
已经分手,看见她的名字还会心痛,是不是还在
推荐资讯
黑执事葬仪屋的图片
海南省屯昌县附近哪里有红砖厂
弹弹堂怎样隐身
景德镇十八泽在哪里啊?怎么去啊?
2000元以下的神舟笔记本都有哪些啊?还有它的
女生真的会记自己的初恋情人一辈子吗
山东省新泰市田村丰源养殖厂我想知道这个在什
为什么我改的自定义头像自己看不见 而好友能
dnf暗黑城的深渊有时后怎么进不去呢?
单机游戏【真三国无双
淮安楚州紫金花苑在哪
360杀毒和小红伞比哪个更好?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?