秋季刘鹏远助教韩越卢梦依课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《秋季刘鹏远助教韩越卢梦依课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 秋季 刘鹏远 助教 韩越卢梦依 课件
- 资源描述:
-
1、2017秋季 刘鹏远助教:韩越/卢梦依数据结构ch.7概述插入排序、希尔排序交换排序、冒泡、快速排序选择排序、堆排序归并排序基数排序、计数排序、桶排序排序方法的分析与比较选择排序n简单选择排序n堆排序简单选择排序n 简单选择排序的基本步骤是:在一组记录 ViVn 中选择具有最小关键字值的记录(索引);若它不是这组记录中的第一个记录,则将它与这组记录中的第一个记录对调;在剩下的记录 Vi+1Vn 中重复执行第、步,直到剩余记录只有一个为止。简单选择排序void selectSort(DataList*L)/伪码伪码 int i,j,min;/min存放最小值位置存放最小值位置 for(i=1;i
2、 L.n;i+)min=i;/选择具有最小关键字值的记录 for(j=i+1;j=L.n;j+)if(L.Vj.key L.Vi.key)min=j;/每次记录每次记录当前具最小关键字值的记录 if(min!=i)/对换到第 i 个位置 swap(L.Vi,L.Vmin);/数据仍然是从数据仍然是从1开始的,从开始的,从0开始则稍有不同开始则稍有不同简单选择排序在第i趟简单选择排序中,关键字值间比较n-i次;元素的移动,最少0次,最多3次。RCN(最好最坏):1+2+.n-1=n(n-1)/2RMN:最好0次(有序),最坏3(n-1)次(待排序记录初始状态是按第一条记录最大,之后的记录从小到大
3、顺序排列)。存储空间额外用1个。简单选择排序是不稳定的(因为相隔一段距离交换数据,实例?)选择排序之锦标赛排序(树形选择排序)改进,如何进行比较,选择一个最值类似现实中分区进行比赛来选冠军的过程(不需要循环赛)P278继续改进-堆排序n设有一个关键字集合,按完全二叉树的顺序存储方式存放在一个一维数组中。对它们从根开始,自顶向下,同一层自左向右从 0 开始连续编号。若满足 Ki K2i+1&Ki K2i+2 或 Ki K2i+1&Ki K2i+2,则称该关键字集合构成一个堆。n前者称为最小堆(小根堆),后者称为最大堆(大根堆)。堆排序 完全二叉树顺序表示堆 Ki K2i+1&Ki K2i+1&K
4、i K2i+2 Ki K2i+2090987877878454565653131532323531717n利用堆及其运算,可以很容易地实现选择排序的思路。n堆排序分为两个步骤1)根据初始输入数据,利用堆的筛选算法 SiftDown()形成初始堆;2)通过一系列的记录交换和重新调整堆进行排序。n堆排序比较适合在数据动态变化中进行排序的情形n除了优先队列,还常用堆在n个元素中挑选(第)k个最值,ksize-2)/2;/从最后分支结点(子树根)开始最后分支结点(子树根)开始 while(start=0)/从后向前逐步调整堆直从后向前逐步调整堆直到最大堆的根到最大堆的根 SiftDown(H,star
5、t,H-size-1);/index为节点数-1 start-;最大堆的向下筛选算法void SiftDown(MaxHeap*H,int start,int EndOfHeap)int i=start,j=2*i+1;/j 是是 i 的左子女的左子女 HeapElem temp=H-datai;/保存待调整元素保存待调整元素 while(j=EndOfHeap)/EndOfHeap为最后一个节点的index if(j dataj.key dataj+1.key)j+;/两子女中选大者两子女中选大者(j为左孩,分支节点必有右孩,为左孩,分支节点必有右孩,倒数第二个叶倒数第二个叶)if(temp
6、.key=H-dataj.key)break;/比最大的大,不用调 else H-datai=H-dataj;i=j;j=2*j+1;/比两子女大者小,则与大子女交换向下滑动比两子女大者小,则与大子女交换向下滑动 H-datai=temp;/待调整元素就位待调整元素就位 堆排序n堆顶元素最大,删除之后,堆顶元素又是其余的最大.n最大堆堆顶H.data0 保存具有最大关键字值的记录,将H.data0 与H.datan-1对调,把具有最大关键字值的记录交换到最后,再对前面的n-1个记录,使用堆的向下筛选算法SiftDown(H,0,n-2),重新建立最大堆,具有次大关键字的记录又上浮到H.data
7、0位置。(这也是为什么需要第三个参数的原因)堆排序n再对调H0和Hn-2,调用sift_down(H,0,n-3),对前n-2个记录重新筛选调整.n如此反复执行,最后得到全部排序好的记录序列。这个算法即堆排序算法。n注意无需从后开始SiftDown,直接从0开始。492525*211608012345082525*16214902543149 25 21 25*16 0808 25 21 25*16 49交换交换 0 号与号与 5 号记录号记录,5 号记录就位号记录就位初始最大堆初始最大堆2525*082116490123451625*0825214902543125 25*21 08 16
8、4916 25*21 08 25 49交换交换 0 号与号与 4 号记录号记录,4 号记录就位号记录就位从从 0 号到号到 4 号号 重新重新调整为调整为最大最大堆堆25*1608212549012345081625*25214902543125*16 21 08 25 4908 16 21 25*25 49交换交换 0 号与号与 3 号记录号记录,3 号记录就位号记录就位从从 0 号到号到 3 号号 重新重新调整为最大堆调整为最大堆211625*082549012345081625*25214902543121 16 08 25*25 4908 16 21 25*25 49交换交换 0 号与
9、号与 2 号记录号记录,2 号记录就位号记录就位从从 0 号到号到 2 号号 重新重新调整为最大堆调整为最大堆160825*212549012345081625*25214902543116 08 21 25*25 4908 16 21 25*25 49交换交换 0 号与号与 1 号记录号记录,1 号记录就位号记录就位从从 0 号到号到 1 号号 重新重新调整为最大堆调整为最大堆堆排序void HeapSort(DataList*H)/伪码 for(i=(H.n-2)/2;i=0;i-)SiftDown(H,i,H.n-1);/建立初始堆 for(i=H.n-1;i=1;i-)swap(H.d
10、ata0,H.datai);/交换 SiftDown(H,0,i-1);/重建最大堆 算法分析n详见教材P282-283。n建堆时,每层进行调整的节点数为2i-1,最多需要调整(该层节点的深度-1)次,每次最多比较2次。总比较次数小于4n。n排序删除调整时,siftdown是O(log2n)的算法,因此可推算大O约为:2(logn-1+.log4+log3+log2),结果为O(nlogn)n 需要一个交换元素用的存储空间O(1)n 堆排序是一个不稳定的排序方法n2路归并排序n多路归并排序n递归/非递归归并排序基本思想:对任意两个有序线性表,第二章中,对其归并的时间复杂度为:O(a+b),也是
11、线性的。对任意一个长度为n的序列,可视为一系列两个长度为1的线性序列(或额外一个长度为1的线性序列),逐层进行归并(长度为1的自然有序)归并排序两路归并(2-way merging)n归并Merge,是将两个或两个以上的有序表合并成一个新的有序表。n例如,原始序列L 中有两个有序表 Ll Lm和Lm+1 Lh。把它们归并成一个有序表,存于另一序列L1的L1l L1h 中。这种归并方法称为两路归并(2-way merging)。n为了实现两路归并,需要设置 3 个指针:变量 i 和 j 是表Ll Lm和Lm+1 Lh的当前检测指针。k 是表 L1 的存放指针。两路归并算法n当 i 和 j 都在两
展开阅读全文