- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
软件基础教案(第九章 排序) 第九章 排序 1.排序概述 2.插入排序算法(直接插入排序和*希尔排序) 3.选择排序算法(直接选择排序和*堆排序) 4.交换排序算法(冒泡排序和*快速排序) 5.各种排序方法比较 49 38 65 97 76 13 27 49’ 13 38 65 97 76 49 27 49’ 13 27 65 97 76 49 38 49’ 13 27 38 97 76 49 65 49’ 13 27 38 49 76 97 65 49’ 13 27 38 49 49’ 97 65 76 13 27 38 49 49’ 65 97 76 13 27 38 49 49’ 65 76 97 直接 选择 排序 示例 2.直接选择 排序示列1 初始关键字序列 第一次排序 第二次排序 第三次排序 第四次排序 第五次排序 结果 3.直接选择 排序示例2 x[0] x[1] x[2] x[3] x[4] x[5] i Small j 0 0 1 1 2 3 4 5 Temp 1 2 1 2 3 4 4 5 2 2 3 4 5 3 3 4 4 5 5 4 4 5 3.直接选择排序算法描述 5.直接选择排序算法 void SelectSort(elemtype R[ ],int n) { int i,j,small; elemtype temp; for (i=0;in-1;i++) { small=i; for (j=i+1;jn;j++) if (R[j].keyR[small].key) small=j; if (small!=i) { temp=R[i]; R[i]=R[small]; R[small]=temp; } } } /* 作 n-1 趟选择排序 */ /* 在无序区选关键字最小的记录R[k] */ /*交换 R[i] 和 R[k] */ 纪录R[0]~R[n-1] 循环n-1次 寻找最小纪录下标k 纪录交换 6.直接选择排序的时间复杂度 1.无论初始状态如何,在第i 趟排序中选择最小关键字的 记录,需做 n-i 次比较,因此总的比较次数为: 直接选择排序是不稳定的排序方法。 2. 当文件为正序时,移动次数为0,文件初态为反序时,每 趟排序均要执行交换操作,总的移动次数取最大值3(n-1)。 7.直接选择排序的稳定性 3.空间复杂性为 O(1); 9.3.2堆排序 (Heap Sort) 堆排序是一种树型选择排序。 在排序过程中,将R[1]到R[n]看成是一个完全二叉树顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择关键字最小记录。 1.堆的定义 n个元素组成序列{a0, a1, ... ,an-1 },若满足下面的条件: ai = a2i+1 2i+1n ai = a2i+2 2i+2n 堆实质上是满足如下性质的二叉树:树中任一非叶子结点的关键字均小于或等于它的孩子结点的关键字。 堆分为最大堆和最小堆. 堆的性质: (1)最大堆的根结点是堆中最大的数据元素,最小堆则相反,称堆的根结点元素为堆顶元素。 (2)对于最大堆,从根结点到每个页结点的路径上,数据元素组成的序列都是递减有序的;对于最小堆,则相反。 10 15 56 25 30 70 10 15 56 25 30 70 小根堆示例 2.堆排序分为两个步骤 第一步,根据初始输入数据,利用堆的调整算法 形成初始堆; 第二步,通过一系列的对象交换和重新调整堆进行排序。 70 56 30 25 15 10 70 56 30 25 15 10 大根堆示例 3.堆排序—建堆 把整个记录数组 R[1]到R[n]调整为一个堆。显然,只有一个结点的树是堆,而在完全二叉树中,所有序号 i = low(n/2) 的结点都是叶子,因此以这些结点为根的子树都已是堆。 只需依次将序号为low(n/2),low(n/2)-1, ...,1的结点作为根的子树都调整为堆即可。 若已知结点R[i]的左右子树已是堆,如何将以 R[i] 为根的完全二叉树也调整为堆? 解决这一问题可采用“筛选法” 基本思想:因为R[i]的左右子树已是堆,这两棵子树的根分别是各自子树中关键字最大的结点,所以必须在R[i]和它的左右孩子中选取关键字最大的结点放到R[i]的位置上。 以大根堆为例进行说明 若R[i]的关键字已是三者中的最大者,则无须做任何调整,以R[i]为根的子树已构成堆,否则必须将R[i]和具
文档评论(0)