- 1、本文档共76页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
软件基础教案(第九章 排序) 第九章 排序 1.排序概述 2.插入排序算法(直接插入排序和*希尔排序) 3.选择排序算法(直接选择排序和*堆排序) 4.交换排序算法(冒泡排序和*快速排序) 5.各种排序方法比较 初始关键字序列 第一次排序 第二次排序 第三次排序 第四次排序 第五次排序 结果 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) 堆排序是一种树型选择排序。 在排序过程中,将a[0]到a[n-1]看成是一个完全二叉树顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择关键字最小记录。 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.堆排序—建堆 把整个记录数组 a[0]到a[n-1]调整为一个堆。显然,只有一个结点的树(叶子结点)是堆,而在完全二叉树中,所有序号 ilow(n-1/2) 的结点都是叶子,因此以这些结点为根的子树都已是堆。 只需依次将序号为low(n-1/2),low(n-1/2)-1, ...,0的结点作为根的子树都调整为堆即可。 若已知结点a[i]的左右子树已是堆,如何将以 a[i] 为根的完全二叉树也调整为堆? 解决这一问题可采用“筛选法” 基本思想:因为a[i]的左右子树已是堆,这两棵子树的根分别是各自子树中关键字最大的结点,所以必须在a[i]和它的左右孩子中选取关键字最大的结点放到a[i]的位置上。 以大根堆为例进行说明 若a[i]的关键字已是三者中的最大者,则无须做任何调整,以a[i]为根的子树已构成堆,否则必须将a[i]和具有最大关键字的左孩子a[2i+1]或右孩子a[2i+2]进行交换。 假定a[2i+1]的关键字最大,将a[i]和a[2i+1]交换位置,交换之后有可能导致a[2i+1]为根的子树不再是堆,但由于a[2i+1]的左右子树仍然是堆,于是可以重复上述过程,将以a[2i+1]为根的子树调整为堆,...,如此逐层递推下去,最多可能调整到树叶。 假定a[2i+2]的关键字最大,将a[i]和a[2i+2]交换位置,交换之后有可
您可能关注的文档
- Abbdcca医学图像处理技术.doc
- Abguxy医学图像处理技术.doc
- AgccakJava课程设计报告.doc
- AlcgthyJava课程设计报告.doc
- c 完整教程.doc
- C++、JAVA集中上机报告模板.doc
- C++常用英语单词.doc
- cadp2的全部配图中文教程!3.doc
- CAVLC编解码详解.doc
- CC++(含数据结构)知识点.doc
- 浙江衢州市卫生健康委员会衢州市直公立医院高层次紧缺人才招聘11人笔试模拟试题参考答案详解.docx
- 浙江温州泰顺县退役军人事务局招聘编外工作人员笔试备考题库及参考答案详解一套.docx
- 江苏靖江市数据局公开招聘编外工作人员笔试模拟试题及参考答案详解.docx
- 广东茂名市公安局电白分局招聘警务辅助人员40人笔试模拟试题带答案详解.docx
- 江苏盐城市大丰区住房和城乡建设局招聘劳务派遣工作人员4人笔试模拟试题带答案详解.docx
- 浙江舟山岱山县东沙镇人民政府招聘笔试模拟试题及参考答案详解1套.docx
- 最高人民检察院直属事业单位2025年度公开招聘工作人员笔试模拟试题含答案详解.docx
- 浙江金华市委宣传部、中共金华市委网信办所属事业单位选调工作人员笔试备考题库及答案详解1套.docx
- 广东深圳市党建组织员招聘40人笔试模拟试题及答案详解1套.docx
- 江苏南京水利科学研究院招聘非在编工作人员4人笔试模拟试题及参考答案详解.docx
文档评论(0)