基数排序的时间是Onlgn课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《基数排序的时间是Onlgn课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基数排序 时间 Onlgn 课件
- 资源描述:
-
1、1 10.4.2 堆排序(堆排序(Floyd&Williams)直接选择的比较次数多是因为后一趟未利用前一趟的直接选择的比较次数多是因为后一趟未利用前一趟的比较结构,树形选择可克服此缺点,但它耗费的空间大,比较结构,树形选择可克服此缺点,但它耗费的空间大,故实用的树形选择是堆排序。故实用的树形选择是堆排序。n 思想思想 将将R1.n看作是看作是1棵完全二叉树的顺序存储结构,利用棵完全二叉树的顺序存储结构,利用完全二叉树的双亲和孩子之关系,在当前无序区里选择最完全二叉树的双亲和孩子之关系,在当前无序区里选择最小(大)元扩充至有序区。小(大)元扩充至有序区。n 二叉堆(快速选择最大二叉堆(快速选择
2、最大/小元)小元)n个个keys序列序列K1,K2,,Kn称为堆,当且仅当满足如称为堆,当且仅当满足如下性质(下性质(堆性质堆性质,堆序堆序):):(1)或或 (2)这里,这里,。即。即i结点不是叶子结点不是叶子iiiikkkk212iiiikkkk2122/1ni2 10.4.2 堆排序堆排序n 堆性质堆性质 将将R1.n看作是完全二叉树的顺序存储结构时,堆性质看作是完全二叉树的顺序存储结构时,堆性质实质上是满足如下性质的完全二叉树:实质上是满足如下性质的完全二叉树:树中任一非叶结点的树中任一非叶结点的key均不大均不大/小于其左右孩子(若存小于其左右孩子(若存在)结点的在)结点的key。即
3、:。即:从根到任一叶子的路径上的结点序列是从根到任一叶子的路径上的结点序列是一个有序序列,堆中任一子树仍是堆。一个有序序列,堆中任一子树仍是堆。它适合查找吗?它适合查找吗?101525305670701056253015堆顶堆顶703025561510107015255630堆顶堆顶小根堆小根堆大根堆大根堆3 10.4.2 堆排序堆排序n 算法思想算法思想 1、初始化、初始化 将将R1.n建成建成大根堆大根堆,即初始无序区。,即初始无序区。2、排序、排序v交换:交换:设当前无序区是大根堆设当前无序区是大根堆R1.i,交换其中的首尾记录,交换其中的首尾记录,即最大元即最大元R1(堆顶)交换到无序
4、区尾部(有序区头部),(堆顶)交换到无序区尾部(有序区头部),使有序区在使有序区在R的尾部逐渐扩大:的尾部逐渐扩大:R1.i-1.keysRi.n.keys/前者为无序区,后者为有序区前者为无序区,后者为有序区 显然,显然,in,n-1,2,即,即n1趟排序即可完成。趟排序即可完成。v调整:调整:将新无序区将新无序区R1.i-1调整为堆。注意:只有调整为堆。注意:只有R1可能违可能违反堆性质。反堆性质。4 10.4.2 堆排序堆排序n 算法实现算法实现void HeapSort(SeqList R)int i;BuildHeap(R);/将将R1.n建成初始堆建成初始堆 for(i=n;i1;
5、i-)/进行进行n-1趟堆排序,当前无序区为趟堆排序,当前无序区为R1.i R1 Ri;/无序区首尾记录交换,无序区首尾记录交换,R0做暂存单元做暂存单元 Heapify(R,1,i-1);/将将R1.i-1重新调整为堆重新调整为堆 n 如何调整堆和构造初始堆?如何调整堆和构造初始堆?5 10.4.2 堆排序堆排序n 调整(重建)堆调整(重建)堆 设调整区间为设调整区间为Rlow.high,因为只有根,因为只有根Rlow违反堆序,它的两子树违反堆序,它的两子树(若存在,则根为(若存在,则根为R2low,R2low+1)均是堆。)均是堆。v 无须调整无须调整 若若Rlow.key不小于两孩子的不
6、小于两孩子的Keys,则,则Rlow不违反堆序不违反堆序v 必须调整必须调整 将将Rlow和它的两孩子中较大者交换:和它的两孩子中较大者交换:设设Rlarge.key=max R2low.key,R2low+1.key 令令Rlow Rlarge 交换后交换后Rlarge可能违反堆序,重复上述过程,直至被调整的结点已满足可能违反堆序,重复上述过程,直至被调整的结点已满足堆序,或该结点已是叶子。堆序,或该结点已是叶子。2010562530155610252030155610202530156 10.4.2 堆排序堆排序n 调整堆算法调整堆算法void Heapify(SeqList R,int
7、low,int high)int large;/只有只有Rlow可能违反堆序可能违反堆序 RecType temp=Rlow;for(large=2*low;largehigh,则,则Rlow是叶子,结束;是叶子,结束;/否则,先令否则,先令large指向指向Rlow的左孩子的左孩子 if(largehigh&Rlarge.key=Rlarge.key)break;/满足堆序满足堆序 Rlow=Rlarge;/交换,小的筛下交换,小的筛下 low=large;/令令low指向新的调整结点指向新的调整结点 Rlow=temp;/将被调整结点放到最终的位置将被调整结点放到最终的位置7 10.4.2
8、 堆排序堆排序n 构造初始堆算法构造初始堆算法 将将R1.n建成堆,须将其每个结点为根的子树均调整为堆。建成堆,须将其每个结点为根的子树均调整为堆。对 叶 子(对 叶 子(i )无 须 调 整,只 要 依 次 将 以 序 号)无 须 调 整,只 要 依 次 将 以 序 号为为 ,2,1的结点为根的子树均调整为堆即可。的结点为根的子树均调整为堆即可。按此次序调整每个结点时,其左右子树均已是堆按此次序调整每个结点时,其左右子树均已是堆 void BuildHeap(SeqList R)int i;for(i=n/2;i0;i-)Heapify(R,i,n);/将将Ri.n 调整为堆调整为堆 n 时
9、间:时间:最坏及平均皆为最坏及平均皆为O(nlgn)(2nlgn+O(n)n 特点:特点:就地,不稳定就地,不稳定2/n12/n2/n8 10.5 归并排序归并排序n 归并的基本思想:归并的基本思想:将将K(K2)个有序表合并成一个新的有序表。)个有序表合并成一个新的有序表。n 二路归并:二路归并:K2,类似于理牌,类似于理牌void Merge(SeqList R,int low,int m,int high)/将将2个有序表个有序表Rlow.m和和Rm+1.high归并为归并为1个有序表个有序表Rlow.high int i=low,j=m+1,p=0;/i,j指向输入子表头,指向输入子表
10、头,p指向输出子表指向输出子表 RecType*R1=(RecType*)malloc(high-low+1)*sizeof(RecType);/输出输出 if(!R1)Error(“存储分配失败存储分配失败”)while(i=m&j=high)/2子表非空时,取其头上较小者输出到子表非空时,取其头上较小者输出到R1p上上 R1p+=(Ri.key=Rj.key)?R i+:R j+;while(i=m)/第第1子表非空,将剩余记录子表非空,将剩余记录copy到到R1中中 R1p+=R i+;while(j=high)/第第2子表非空,将剩余记录子表非空,将剩余记录copy到到R1中中 R1p
11、+=R j+;R=R1;/将将R1copy回回R,Rlow.high R10.high-low9 10.5 归并排序归并排序n 排序算法排序算法v 自底向上自底向上:见:见Fig10.13v 自上而下自上而下:分治法设计:分治法设计 (1)分解分解:将当前区间一分为二,分裂点:将当前区间一分为二,分裂点mid (2)求解求解:递归地对:递归地对2个子表个子表Rlow.mid和和Rmid+1.high进行归并排序,进行归并排序,出口是当前区间长度为出口是当前区间长度为1。(3)组合组合:将上述两有序的子表归并成:将上述两有序的子表归并成1个有序表个有序表Rlow.highvoid MergeSo
展开阅读全文