- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
顺序存储的线性表中的关键字数量有限的记录的排序方法
顺序存储的线性表中关键字数量有限的记录的排序方法
摘 要 关于排序已经有许多成熟的算法,但对于一些特殊的问题和有特殊要求的问题,已有的一些经典的排序算法却不一定能满足题目要求,本文就关键字数量有限的记录的排序问题提出了一个有效的算法。 关键词 排序;关键字;比较;交换1 引言 排序是计算机程序设计中的一种重要操作,它的功能是将一个或记录的任意序列重新按其关键字的某种次序(非递减或非递增顺序)排列起来,使其具有一定的顺序,以便于进行数据查找。通常,在排序过程中需进行下列两种基本操作:比较两个关键字的大小;将记录从一个位置移动到另一个位置。前一个操作对大多数排序方法来说都是必要的,而后一个操作则随着记录的存储方式和使用的排序方法的不同而有所不同。对于存储在线性表中的记录进行排序,其主要操作是要通过一系列的比较使不在正确位置上的记录通过交换操作使之到达正确的位置上,一次交换操作可以交换两条记录的位置,因此提高排序效率的很重要的一个方面就是尽量减少记录移动的次数。2 问题的提出 在实际问题中经常遇到这样一种特殊情况的排序,即对关键字个数有限的记录进行排序。例如,试图对某次竞赛的奖牌榜进行排序时就只有3个关键字,即:金牌、银牌和铜牌(或一等奖、二等奖和三等奖),所有的金牌获得者在最前面,随后是银牌获得者,最后是铜牌获得者。要对奖牌榜排成符合要求的顺序而又要求用最少的交换次数来实现,对类似这样的问题我们可以用下面的题目来描述: 对于一个给定的只含有3个关键字的记录序列,将其按非递减顺序排列,要求交换次数最少。现假设关键字只有1、2、3(当然也可以是其它数据,比如9、20、57等)一个顺序存储的线性表,设计一个算法将该顺序表按非递减排序,要求交换次数最少。3 算法分析 在众多排序算法中,选择法排序相对于其它排序方法来说,平均交换次数是最少的,尤其是在关键字杂乱无章的情况下使用选择法排序可以有效地减少交换次数。选择法的基本思想是:首先从序列中选择关键字最小的记录同第一条记录交换,再从余下的记录中选择关键字最小的与第二条记录交换,这样往复下去,直到全部记录排序完成。如对于如下的初始序列: 也就是原序列的第0条记录和第3条记录进行了交换操作,使原第3条记录到达了应该到达的正确位置,而原第0条记录到达了第3条记录的位置,但我们可以看出显然不是它应该到达的最终位置,所以至少还要需要一次交换操作才有可能使该记录最终到位。最终使上述序列排成非递减序列需要进行4次交换操作。其排序过程如下: 初始序列: 3 2 3 1 2 2 1 3 1 1 第一次交换后:1 2 3 3 2 2 1 3 1 1 第二次交换后:1 1 3 3 2 2 2 3 1 1 第三次交换后:1 1 1 3 2 2 2 3 3 1 第四次交换后:1 1 1 1 2 2 2 3 3 3 通过上述的分析,对关键字数量有限的记录排序,用选择法进行显然交换次数不是最少的。针对题目要求,如果我们在交换时尽可能地做到使两条记录同时到位,则交换次数肯定会少于选择法。 因为要排成非递减序列,所以关键字小的记录应该在序列的前半部分,而关键字大的记录应该在序列的后半部分。为此,我们可以按如下方法进行排序:假设a[low…high]是一维数组,我们让变量mid=(low+high)/2;指针i、j作为控制搜索的变量,指针i用来在记录的前半部分搜索,指针j用来在记录的后半部分搜索;指针frontMax用来记录数组前半部分中关键字值最大的记录位置,每次搜索其初始值都为low,指向第一个记录位置;指针backMin用来记录数组后半部分中关键字值最小的记录的位置,每次搜索时其初始值都为high,指向最后一个记录的位置;变量exchangeNum记录交换的次数,其初始值为0。 排序的具体过程为:我们首先从序列的开始(第low条记录)在序列的前半部分搜索关键字值最大的记录,用变量frontMax来记录找到的关键字值最大的记录的位置;从序列的最后开始(第high条记录)在序列的后半部分中搜索关键字值最小的记录,用变量backMin记录序列后半部分中关键字值最小的记录位置。搜索完一遍后用frontMax指示的记录的关键字值a[frontMax]和backMin指示的记录的关键字值a[backMin]进行比较,若a[frontMax] gt; a[backMin],说明这两个位置上的记录都不在正确的位置上,则这两个位置的记录要做一次交换,同时交换次数exchangeNum增加1。由于序列关键字的数量是有限的,一次交换有可能使两条记录同时到位,这样就可以有效地减少记录交换的次数;若在搜索完后没有发生交换,说明前半部分中所有记录的关键字值都不大于后半部分中所有记录的关键字值,则结束本次搜索过程。然后将序列分为两个部分a[low…m
文档评论(0)