- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
从图9-6(a)可知,8个队经过4场比赛,获胜的4个队进入半决赛,再经过两场半决赛和1场决赛即可知道冠军是谁(共7场比赛),按照锦标赛的传递关系,亚军只能分别从在决赛、半决赛和第一轮比赛中输给冠军的队中选取,于是亚军只能在b、c、e这3个队中产生(见图9-6(b)),即进行两场比赛(e与c一场,e与c的胜队与b一场)后,即可知道亚军是谁。同理,第三名只需在c、f、g这3个队中产生(见图9-6(c)),即进行两场比赛(f与g一场,f与g的胜队与c一场),即可知道第三名是谁。 树形选择排序(Tree Selection Sorting),又称锦标赛排序(Tournament Sorting),是一种按照锦标赛的思想进行选择排序的方法。首先对n个记录的排序码进行两两比较,然后在其中?n/2?个较小者之间再进行两两比较,如此重复,直到选出最小排序码为止。 例如,给定排序码50,37,66,98,75,12,26,49,树形选择排序的过程见图9-7。 (a)经过7次比较得到最小值12 (b)输出12后,经过两次比较得到第二小值26 (c)输出12,26后,经过两次比较得到第三小值37 (d)输出12,26,37后,经过两次比较得到第四小值49 (e)输出12,26,37,49后,经过1次比较得到第五小值50 (f)输出12,26,37,49,50后,经过1次比较得到第六小值66 (g)输出12,26,37,49,50,66后,经过1次比较得到第七小值75 (h)输出12,26,37,49,50,66,75后,经过1次比较得到第八小值98 图9-7 树形选择排序过程示意 在树形选择排序中,含有n个叶子结点的完全二叉树的深度为?log2n?+1,除了最小排序码外,每选择一次小排序码时,仅需进行?log2n? 次比较,因此,该排序算法的时间复杂度为O(nlog2n)。但是,这种排序方法需要用很多临时指针来保存比较的中间信息,占用较多的辅助单元,故树形选择排序一般很少采用,而一般采用另一种形式的选择排序—堆排序。 9.4.3 堆排序 1.堆的定义 若有n个元素的排序码k1,k2,k3,…,kn,当满足如下条件: ki≤k2i ki≥k2i (1) 或 (2) ki≤k2i+1 ki≥k2i+1 其中i=1,2,…, ?n/2? 则称此n个元素的排序码k1,k2,k3,…,kn为一个堆。 若将此排序码按顺序组成一棵完全二叉树,则(1)称为小根堆(二叉树的所有根结点值小于或等于左右孩子的值),(2)称为大根堆(二叉树的所有根结点值大于或等于左右孩子的值)。 若n个元素的排序码k1,k2,k3,…,kn满足堆,且让结点按1,2,3,…,n顺序编号,根据完全二叉树的性质(若i为根结点,则左孩子为2i,右孩子为2i+1)可知,堆排序实际与一棵完全二叉树有关。若将排序码初始序列组成一棵完全二叉树,则堆排序可以包含建立初始堆(使排序码变成能符合堆的定义的完全二叉树)和利用堆进行排序两个阶段。 2.堆排序的基本思想 将排序码k1,k2,k3,…,kn表示成一棵完全二叉树,然后从第?n/2?个排序码开始筛选,使由该结点作根结点组成的子二叉树符合堆的定义,然后从第?n/2? -1个排序码重复刚才的操作,直到第一个排序码止。这时,该二叉树符合堆的定义,初始堆已经建立。接着,可以按如下方法进行堆排序:将堆中第一个结点(二叉树根结点)和最后一个结点的数据进行交换(k1与kn),再将k1~kn-1重新建堆,然后k1和kn-1交换,再将k1~kn-2重新建堆,然后k1和kn-2交换,如此重复下去,每次重新建堆的元素个数不断减1,直到重新建堆的元素个数仅剩一个为止。这时堆排序已经完成,则排序码k1,k2,k3,…,kn已排成一个有序序列。 若排序是从小到大排列,则可以用建立大根堆实现堆排序,若排序是从大到小排列,则可以用建立小根堆实现堆排序。 例如,给定排序码46,55,13,42,94,05,17,70,建立初始堆的过程如图9-8所示。 (a)初始无序的结点,从42开始调整 (b)将以13为根的子树调整成堆 (c)将以55为根的子树调整成堆 (d)将以46为根的子树调整成堆 (e)成堆 图9-8 建立初始大根堆的过程示意图 对排序码46,55,13,42,94,05,17,70,建成如图9-8(e)所示的大根
文档评论(0)