




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
选择排序(Selectionsort),选择排序(Selectionsort)是以选择为基础的一种常用排序方法,从记录的无序子序列中“选择”关键字最小或最大的记录,并将其加入到有序子序列的一端,以增加记录的有序子序列的长度。它也有几种不同的实现方法,这里仅介绍简单选择排序、树形排序和堆排序。,1.简单选择排序(1)算法描述简单选择排序算法的基本思路:对于一组关键字(Kl,K2,Kn),将其由小到大进行排序,首先从Kl,K2,Kn中选择最小值,假设是Kk,则将Kk与K1对换;然后从K2,K3,Kn中选择最小值Kk+1,再将Kk+1与K2对换。如此进行选择和调换,对第i趟选择排序,进行n-i次关键字比较,从n-i+1个记录中选出关键字最小的记录,并与第i个记录交换。令i从1至n-1,进行n-1趟选择排序,一个由小到大的有序序列就形成了。,例1设有一组关键字49,39,66,49*,76,11,27,96,这里n8。试用简单选择排序方法,将这组记录由小到大进行排序。其排序过程如图所示,,算法实现如下:voidSelectSort(SqList/*SelectSort*/,(2)算法分析在简单选择排序中,无论待排序的记录初始序列是否有序,都需要执行n(n-1)/2次关键字的比较操作。如果待排序的记录初始序列就是已经排好序的正列,则无须移动记录,因为每个元素都位于其最终位置上了;而如果待排序的记录初始序列是逆序,即在最坏情况下,则要做3(n-1)次记录移动。所以,简单选择排序的时间复杂度是O(n*n)。由上面的例1很显然看到,49在排序前位于49*的前面,而经简单选择排序后却位于49*后面了,它们的相对位置发生了颠倒,因此简单选择排序算法是不稳定排序算法。,3.堆排序(1)堆的定义堆是一个记录序列k1,k2,kn,对于列表中位置i(编号从1开始)处的记录的关键字ki,当且仅当满足下列关系时,称之为堆。kik2i或kik2ikik2i+1kik2i+1(i1,2,n/2)其中,每个结点关键字都不小于其子孙结点关键字的堆称为“大根堆”;而每个结点关键字都不小于其子孙结点关键字的堆称为“小根堆”。下面的讨论中以小根堆为例。,判断下列序列是否为堆?(100,85,98,77,80,60,82,40,20,15,67)(100,98,85,82,80,77,60,40,20,15,67)(15,20,40,60,67,77,80,82,85,98,100),我们已经知道,对于一棵有n个结点的完全二叉树,当它的结点由上而下,自左至右编号之后,编号为1n/2的结点为分支结点,编号大于n/2的结点为叶子结点,对于每个编号为i的分支结点,它的左孩子的编号为2i,它的右孩子的编号为2i+1。对于每个编号为i(i1)的结点,它的双亲的编号为i/2。因此,我们还可以借助完全二叉树来描述堆的概念:若完全二叉树中任一非叶子结点的值均小于等于(或大于等于)其左、右孩子结点的值,则从根结点开始按结点编号排列所得的结点序列就是一个堆。,(2)算法描述堆顶记录对应完全二叉树的根结点,堆顶记录关键字是所有记录关键字的最值,堆排序就是利用堆的上述特征完成排序的。在输出堆顶的最大(或最小)之后,使得剩余的n-1个记录的序列重新调整为一个堆,于是又得到次大(或次小)值如此反复执行,直至所以记录都排序为一个有序序列。这就是堆排序(HeapSort)。,由于初始记录序列不一定满足堆关系,因此堆排序过程大体分两步处理:初建堆。从堆的定义出发,先取i=n/2(它一定是第n个结点双亲的编号),将以i结点为根的子树调整成为堆;然后令i=i-1;再将以i结点为根的子树调整成为堆。此时可能会反复调整某些结点,直到i=1为止,堆初建完成。,堆排序。首先输出堆顶元素(一般是最小值),让堆中最后一个元素上移到原堆顶位置,然后恢复堆,因为经过第一步输出堆顶元素的操作后,往往破坏了原来的堆关系,所以要恢复堆;重复执行输出堆顶元素、堆尾元素上移和恢复堆的操作,直到全部元素输出完为止。按输出元素的前后次序排列,就形成了有序序列,完成了堆排序的操作。,例设有n个记录(n8)的关键字是30,50,60,35,86,10,40,45,试用堆排序方法,将这组记录由小到大进行排序。,第一步:初始建堆,其建堆过程如图所示。因为n=8,所以从i4开始。,第二步:堆排序。这是一个反复输出堆顶元素,将堆尾元素移至堆顶,再调整恢复堆的过程。恢复堆的过程与初建堆中i=1时所进行的操作完全相同。请注意:每输出一次堆顶元素,堆尾的逻辑位置退1,直到堆中剩下一个元素为止,排序过程如图所示。,输出序列:1030354045506086,由上可知,调整恢复堆操作过程要被多次反复调用,即当i值确定之后,以ki为比较参照值,与其左、右孩子的关键字比较和调整,使以结点i为根的子树成为堆,因此把此过程设计成函数Heap:voidHeap(RedTyper,inti,intm)/*i是根结点编号,m是以i结点为根的子树的最后一个结点编号*/x=ri;j=2*i;/*x保存根记录的内容,j为左孩子编号*/while(j=m)if(jmv=2;v-)x=r1;r1=rv;rv=x;/*堆顶堆尾元素对换*/Heap(r,1,v-1);/*本次比上次少处理一个记录*/*Heapsort*/,(3)算法分析在堆排序图示例中,堆越画越小,堆中结点越来越少,实际上,在用来存储堆的数组中堆顶元素输出之后并未删除,而是与堆尾元素对换。从图示看输出的是一个由小到大的升序序列,实际最后数组中记录的关键字从rl.key到rn.key是一个由大到小的降序序列。算法Heap的时间复杂度与堆所对应的完全二叉树的树深log2n相关,而算法Heapsort中对Heap的调用数量级为n,所以整个堆排序的时间复杂度为O(nlog2n)。,稳定性如何?,判断下列序列是否为堆。若不是,则把它们依次调整为堆。(100,85,98,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 心内科护士工作总结
- 中班健康教育活动说课大纲
- 中医儿科小儿肺炎咳喘诊疗要点
- 园本培训幼儿园一日常规
- 餐饮的工作计划(35篇)
- 常见急诊急救相关知识培训
- 采购公司培训
- 护理心内中医定向治疗
- 2025年肿瘤防治宣传周科普行动
- 超市礼貌礼仪培训
- 脓毒血症指南解读
- 北京市海淀区101中学2022-2023学年七年级数学第二学期期末质量检测试题含解析
- 混凝土结构工程施工质量验收规范
- GB/T 4956-2003磁性基体上非磁性覆盖层覆盖层厚度测量磁性法
- GB/T 14594-2005无氧铜板和带
- 广东电网“两种人”安规题库-配电“两种人”类(试题及答案)
- 某射击馆照明平面回路设计及智能照明控制分析
- (完整word版)儿童迷宫图 清晰可直接打印
- 土地利用变更调查课件
- DB13T 5181-2020 尾矿库溃坝泥石流数值模拟技术规程
- Q∕SY 06303.5-2018 油气储运工程线路设计规范 第5部分:输气管道工程阀室
评论
0/150
提交评论