逆序对排序工作量解题报告.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
逆序对排序工作量解题报告 By jackchen1998 (sort.pas/c/cpp) 【问题描述】 Sort公司是一个专门为人们提供排序服务的公司,该公司的宗旨是: “顺序 是最美丽的”。他们的工作是通过一系列移动,将某些物品按顺序摆好。他们的 服务是通过工作量来计算的,即移动东西的次数。所以,在工作前必须先考察工 作量,以便向用户提出收费数目。 用户并不需要知道精确的移动次数,实质上,大多数人都是凭感觉来认定这 一列物品的混乱程度,根据 Sort公司的经验,人们一般是根据“逆序对”的数 目多少来称呼这一序列的混乱程度。 假设我们将序列中第I件物品的参数定义为 A[l],那么,排序就是指将A数组从小到大排序。所谓“逆序对”是指目前A[1..N] 中元素各不相同,若KJ且A[I]A[j],则[I,J]就为一个“逆序对”。 例如,数组 3,1,4,5,2的“逆序对”有 3,1,3,2,4,2,5,2,共 4 个(如 图1所示)。 请你为Sort公司做一个程序,在尽量短的时间内,统计出“逆序对”的数 目。 1 1 「 1 3 1 | 4 5 2 (图1) 【输入文件】 从SORT.IN文件中读入数据,文件的第一行为一个整数 N ( K N 10000), 文件的第二行为N个实数。 【输出文件】 结果输出到SORT.OUT文件中。文件共一行,为“逆序对”的数目。 【样例输入】 5 3 1 4 5 2 【样例输出】 4 求逆序对 (deseq.pas/c/cpp) 问题描述: 给定一个序列a1,a2,…,an,如果存在ij并且aiaj,那么我们称之为逆序对,求逆序对 的数目。 输入格式: 输入文件deseq.in第一行为n,表示序列长度,接下来的 n行,第i+1行表示序列中的第 i个数。 输出格式: 输出文件deseq.out仅一个数,所有逆序对总数 . 输入样例(deseq. In): 4 3 2 3 2 输入样例(deseq.out) 3 数据范围: N=105。Ai=105。时间限制为 1s。 解题报告: 《排序工作量》问题实质上就是求出一列数中的“逆序对” 。所谓“逆序对”就是指数的 大小与其在序列中的顺序相反的一对数。例如:3,4,2,1,3中“逆序对”有 3,2,3,1,4,2,4,1,4,3 这 5 个。 如果不仔细分析,可以得出如下的方法,也是最基本的方法: 对于每个数 Ai,考察A(i+1)至An中大于Ai的个数。 具体如下: tot:=0; For I:= 1 to n do For j:=I+1 to n do If A[j]A[I] the n In c(tot); Return(tot); 这个算法的效率如何呢?其时间复杂度为 O(NA2),对于本题,N最大为10000,显然 运行的时间过长。 那么,如何在较快的时间内求出“逆序对”的数目呢? 上面的算法慢在分析 Ai 时没有利用 A1 至 A(i-1) 的分析结果,如果,我们在分析 Ai 时同时分析了 A1 至 A(I-1) ,那么时间就一定会提高。 于是,得出了一个与“归并排序”十分类似的方法。 我将数组 A 划分为两部分, A[1..i] 与 A[I+1..N] ,然后分别求各部分的“逆序对” ,同时 将各部分排序,然后将左右两部分的结果“综合利用” ,在 O(N) 的时间内求出左部分相对于 右部分的“逆序对” ,再将这些值加起来,就为整个的“逆序对”数目。 具体算法如下: Function Sort(Var A:Array[1..N] of Real;L,R:Integer):Integer; { 这个函数返回 A 数组 A[L..R] 中“逆序对”的数目,并对 A[L..R] 排序 } Begin IF LR Then Begin T:=(L+R) Div 2; P1:=Sort(A,L,T); P2:=Sort(A,T+1,R); P3:=Merge(A,L,T,R); Sort:=P1+P2+P3; End; End; Function Merge(Var A:array[1..N] of Real;L,T,R:Integer):Integer; { 这个函数是将 A 数组已经排好序的两部分综合在一起, 并求出左部分相对于右部分 的“逆序对”数目 } Begin I:=L;J:=T+1;P:=0;W:=L-1; While (I=T) and (J=R) Do If A[I]A[J] Then Begin Inc(w); B[w]:=A[I]; Inc(P,J-T); Inc(I); End Else Begin Inc(w); B[w]:=A[J]; Inc(j); End; While I=T Do Begin Inc(w); B[w]

文档评论(0)

dajiefude2 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档