版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
10.4选择排序(1)简单选择排序(2)堆排序基本思路主要的选择排序方法:全局有序区无序区选出最小元素R[k]1/3710.4.1简单选择排序1.排序思路
从一个无序区中选出最小的元素,最简单方法是逐个进行元素比较,例如,从无序区R[i..n-1]中选出最小元素R[minj]。intminj=i; //minj先置为区间中的首元素序号for(intj=i+1;j<n;j++) //从R[i..n-1]中选最小元素的R[minj]if(R[j].key<R[minj].key)minj=j;简单选择2/37有2n个整数,找到其中最大整数需要比较次数最少是()次。A.n B.log2n C.n2D.2n E.2n-1 F.n-1示例3/37全局有序区R[0]
……
R[i-1]无序区R[i]
……
R[n-1]全局有序区R[0]
……
R[i-1]R[i]无序区R[i+1]
……
R[n-1]采用简单选择方法选出最小元素初始时,全局有序区为空i=0~n-2,共经过n-1趟排序4/372.排序算法publicvoidSelectSort(){ //对R[0..n-1]元素进行简单选择排序RecTypetmp;for(inti=0;i<n-1;i++){ //做第i趟排序intminj=i;for(intj=i+1;j<n;j++) //无序区R[i..n-1]中选最小元素R[minj]if(R[j].key<R[minj].key)minj=j;if(minj!=i) //R[minj]不是无序区首元素swap(i,minj); //交换R[i]和R[minj]}}5/37
【例10.6】设待排序的表有10个元素,其关键字分别为(6,8,7,9,0,1,3,2,4,5)。说明采用简单选择排序方法进行排序的过程。初始关键字 []6 8 7 9 0 1 3 2 4 5i=0的结果: [0] 8 7 9 6 1 3 2 4 5i=1的结果: [0 1] 7 9 6 8 3 2 4 5i=2的结果: [0 1 2] 9 6 8 3 7 4 5i=3的结果: [0 1 2 3] 6 8 9 7 4 5i=4的结果: [0 1 2 3 4] 8 9 7 6 5i=5的结果: [0 1 2 3 4 5] 9 7 6 8i=6的结果: [0 1 2 3 4 5 6] 7 9 8i=7的结果: [0 1 2 3 4 5 6 7] 9 8i=8的结果: [0 1 2 3 4 5 6 7 8] 96/377/363.算法分析
无论初始数据序列的状态如何,在第i趟排序中选出最小元素,内for循环需做n-1-(i+1)+1=n-i-1次比较,因此,总的比较次数为8/37元素的移动次数当初始数据序列正序时,移动次数为0。反序时每趟排序均要执行交换操作,此时总的移动次数为最大值3(n-1)。最好、最坏和平均情况的时间复杂度均为O(n2)。9/37是一种不稳定的排序方法(5,
5,1)无序区交换(1,5,5)10/3710.4.2堆排序1.排序思路全局有序区无序区选出最小元素R[k]采用堆方法选出最小元素:堆排序算法11/37一个序列R[1..n],关键字分别为k1、k2、、kn。堆的定义该序列满足如下性质(简称为堆性质):
ki≤k2i
且ki≤k2i+1
或
ki≥k2i
且ki≥k2i+1 (1≤i≤
n/2)满足第
种情况的堆称为小根堆,满足第
种情况的堆称为大根堆。下面讨论的堆是大根堆。12/37a1a2a3an…完全二叉树i2i2i+1左孩子右孩子大根堆:对应的完全二叉树中,任意一个结点的关键字都大于或等于它的孩子结点的关键字。最小关键字的元素一定是某个叶子结点!!!层序编号方式:a1
a2
…
an
将序列a1
a2
…
an看成是一颗完全二叉树13/371295413n=6如何判断一颗完全二叉树是否为大根堆124356从编号为n/2=3的结点开始,逐一判断所有分支结点所有分支结点满足定义
大根堆14/37
堆排序的关键是构造堆,这里采用筛选算法建堆。
所谓“筛选”指的是,对一棵左/右子树均为堆的完全二叉树,“调整”根结点使整个二叉树也成为一个堆。堆堆筛选堆筛选2.排序算法15/37是一个堆是一个堆295413
筛选:不是堆
堆从根开始筛选大根堆tmp16/37295413从根开始筛选直接插入排序思路17/36仅仅处理从根结点
某个叶子结点路径上的结点n个结点的完全二叉树高度为
log2(n+1)
所有筛选的时间复杂度为O(log2n)295413从根开始筛选18/37low2*low2*low+1……high…筛选算法sift(RecType[]R,intlow,inthigh):R[low..high]R[low..high]根最后结点19/37privatevoidsift(intlow,inthigh){ //对R[low..high]进行筛选inti=low,j=2*i; //R[j]是R[i]的左孩子RecTypetmp=R[i]; //tmp临时保存根结点while(j<=high){ //只对R[low..high]的元素进行筛选if(j<high&&R[j].key<R[j+1].key) j++; //若右孩子较大,把j指向右孩子if(tmp.key<R[j].key){ //tmp的孩子较大R[i]=R[j]; //将R[j]调整到双亲位置上i=j;j=2*i; //修改i和j值,以便继续向下筛选}elsebreak; //若孩子较小,则筛选结束}R[i]=tmp; //原根结点放入最终位置}20/37
一颗完全二叉树
初始堆435216124356例如,序列:(4,3,5,2,1,6),n=6从编号为n/2=3的结点开始,逐一筛选65546初始堆:(6,3,5,2,1,4)for(i=n/2;i>=1;i--)//循环建立初始堆
sift(i,n);最大元素筛选步骤:sift(3,6)sift(2,6)sift(1,6)21/37635214124356
最大元素归位4,3,5,2,1,6最大元素6归位R[1]R[i]4352112435654R[1]R[i-1]再对R[1..i-1]的元素进行筛选22/37堆排序算法:publicvoidHeapSort(){ //对R[1..n]按递增进行堆排序for(inti=n/2;i>=1;i--) //循环建立初始堆sift(i,n); //对R[i..n]进行筛选for(inti=n;i>=2;i--){ //进行n-1趟排序,每一趟排序的元素个数减1swap(1,i); //将区间中最后一个元素与R[1]交换
sift(1,i-1); //从R[1]继续筛选,得到i-1个结点的堆}}23/37
【例10.7】设待排序的表有10个元素,其关键字分别为{6,8,7,9,0,1,3,2,4,5}。说明采用堆排序方法进行排序的过程。排序序列:6,8,7,9,0,1,3,2,4,58952401376看成是一棵完全二叉树24/37调整成初始大根堆:8952401376调整完毕,成为一个大根堆987651324025/378602451379输出9(归位)从根结点筛选6420513780876513249第1趟排序26/37642051378输出8(归位)从根结点筛选642510370674513289第2趟排序其他各趟排序依此进行0123456789最终结果:27/37
对高度为h的堆,一次“筛选”所需进行的关键字比较的次数至多为2(h-1)。
调整“堆顶”n-1次,总共进行的关键字比较的次数不超过:
2(
log2(n-1)
+
log2(n-2)
+…+log22)<2n(
log2n
)
对n个关键字,建成高度为h(=
log2n+1)的堆,所需进行的关键字比较的次数不超过4n。3.算法分析堆排序的时间复杂度为O(nlogn)。空间复杂度为O(1),不稳定。28/37设有1000个无序的整数,希望用最快的速度挑选出其中前10个最大的元素,最好选用()排序方法。A.冒泡排序 B.简单选择排序C.堆排序 D.直接插入排序n=1000,k=10冒泡排序的大致时间:kn堆排序的大致时间:4n+klog2n。示例29/37数据结构经典算法的启示简单选择排序算法堆排序算法利用了连续多次查找最大元素的特性优先队列就是采用堆实现的!30/3610.4.3堆数据结构线性表voidpush(Ee):向堆中插入元素e。Epop():删除一个元素并且返回该元素。这里的删除运算仅仅删除非空队的堆顶元素。booleanempty():判断堆是否为空。用R[1..n]存放一个堆,即(R,n)31/371.插入运算算法设计85632(a)一个大根堆85632(b)末尾添加1010810632(c)10与双亲交换5108632(d)10与双亲交换532/37插入运算:作为叶子结点插入到末尾,从该位置先上筛选变为大根堆。publicvoidpush(RecTypee){ //插入元素en++; //堆中元素个数增1R[n]=e; //将e添加到末尾if(n==1)return; //e作为根结点的情况intj=n,i=j/2;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 模块电源项目可行性研究报告
- 生物信息学DNA序列比对项目指导课程设计
- 吃水不忘挖井人课程设计
- 毕设课程设计范文
- 深度强化学习AI游戏渲染效果提升课程设计
- 初三语文阅读题课程设计
- 修改与润饰教学设计中职基础课-拓展模块 下册-高教版(2023)-(语文)-50
- 搜索引擎智能客服实现课程设计
- 基于OpenCV的人脸比对设计课程设计
- 2026年高校会计学原理期末考试模拟试题(含答案)
- 新人教版初中英语七八九年级全部单词全集
- 2026年秋季学期苏教版小学数学五年级上册教学计划含进度表
- 2026新教材语文 三年级上册第七单元22 《读不完的大书》说课教学课件
- 《精细化工生产技术 》课件-涂料新技术-创新驱动绿色未来
- 混凝土路面铣刨施工方案
- 部编人教版 五年级上册语文 教师用书 电子版
- 2026年文旅行业安全生产试题及答案
- 2026年三级健康管理师《操作技能》考试真题(后附答案及解析)
- CSCO肿瘤治疗相关心血管毒性防治指南
- 2026年《中国负压封闭引流技术临床应用指南》(NPWT-VSD完整版)
- 肌萎缩侧索硬化诊断和治疗中国专家共识2026
评论
0/150
提交评论