[计算机软件及应用]第八章-排序.pptVIP

  1. 1、本文档共73页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第8章 排 序 学习目的要求: 8.3.2 堆排序 堆排序(Heap Sort)是利用堆的特性进行排序。 堆的定义如下: n个元素的序列为{K1,K2,…,Kn}, 当且仅当满足下列关系时,称之为堆。 Ki≤K2i ,Ki≤K2i+1或Ki≥K2i ,Ki≥K2i+1(i=1,2,…,n/2) 若将与此序列对应的一维数组看成是一棵完全二叉树按层次编号的顺序存储,则堆的含义表明,完全二叉树中所有非终端结点的值均不小于(或不大于)其左、右孩子结点的值。因此,堆顶元素的值必为序列中的最大值或最小值(即大顶堆或小顶堆)。 8.3 选择排序 8.3 选择排序 堆排序的基本思想是:对一组待排序的记录,首先把它们按堆的定义排成一个堆,将堆顶元素取出;然后把剩下的记录再排成堆,取出堆顶元素;依次下去,直到取出全部元素,从而将全部记录排成一个有序序列。 8.3 选择排序 实现堆排序需要解决两个问题: (1)如何将一个无序序列建成一个堆? (2)如何在输出堆顶元素之后,调整剩余元素成为一个新的堆? 建堆就是把待排序的记录序列{R1,R2,…,Rn},按照堆的定义调整为堆,使父结点的关键字大于(或小于)子结点的关键字。为此,我们先把待排序数据初始次序置入完全二叉树的各个结点中,然后由下而上逐层进行父子结点的关键字比较并交换,直到使其最后满足堆的条件。 建堆时是从最后一个非终端结点 n/2 开始的。 例如,假定待排序的一组数据序列为: 42 36 56 78 67 11 27 36 8.3 选择排序 40 55 49 73 81 64 36 12 27 98 例如: 排序之前的关键字序列为 12 36 81 73 49 98 81 73 55 现在,左/右子树都已经调整为堆,最后只要调整根结点,使整个二叉树是个“堆”即可。 98 49 40 64 36 12 27 对一组有n个记录的待排序序列进行按关键字递减排序时,先建立一个大顶堆,然后选取关键字值最大的堆顶记录与最后一个记录交换,再对前n-1个记录调整为一个新的大顶堆,如此反复直到排序结束。 8.3 选择排序 堆排序对n较大的文件很有效,对记录数较少的文件不值得提倡。整个堆排序的时间复杂度为O(nlog2n),堆排序仅需一个记录大小供交换用的辅助存储空间。对于存在相同关键字的记录的情况,堆排序是不稳定的。 8.3 选择排序 8.4 交换排序 基本思想是: 两两比较待排序记录的关键字,若发现两个记录的次序为逆序时,交换其存储位置,直到没有逆序的记录为止。 冒泡排序 快速排序 8.4 交换排序 8.4.1 冒泡排序 冒泡排序是一种简单的排序方法。 基本思想:对所有相邻记录的关键字值进行比较,如果是逆序(r[i]r[i+1]),则交换其位置,经过多趟排序,最终使整个序列有序。 假设在排序过程中,记录序列R[1..n]的状态为: 第 i 趟起泡排序 无序序列R[1..n-i+1] 有序序列 R[n-i+2..n] n-i+1 无序序列R[1..n-i] 有序序列 R[n-i+1..n] 比较相邻记录,将关键字最大的记录交换到 n-i+1 的位置上 8.4 交换排序 处理过程为: 第一趟:从第一条记录r[1]开始,直到最后一条记录r[n],对两两相邻的记录依此比较,若发现为逆序,则立即交换其位置,最后使这n条记录中关键字最大的记录“下沉”到最底部,既被交换到第n个位置上,它不参与下一趟排序; 第二趟:从第一条记录r[1]开始,直到第n-1条记录r[n-1],对两两相邻的记录依此比较,若发现为逆序,则立即交换其位置,最后使这n-1条记录中关键字最大的记录“下沉”到次底部,既被交换到第n-1个位置上,它不参与下一趟排序; 如此反复,最多经过(n-1)趟冒泡排序,就可以使整个序列成为有序序列。 49 38 65 97 76 13 27 30 初始关键字 38 49 65 76 13 27 30 97 第一趟 38 49 65 13 27 30 76 第二趟 38 49 13 27 30 65 第三趟 38 13 27 30 49 第四趟 13 27 30 38 第五趟 13 27 30 第六趟 38 49 76 97 13 97 27 97 97 30 13 76 76 76 13 65 27 30 65

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档