数据结构第10章排序2选择排序归并排序基数排序.pptx





《数据结构第10章排序2选择排序归并排序基数排序.pptx》由会员分享,可在线阅读,更多相关《数据结构第10章排序2选择排序归并排序基数排序.pptx(70页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、武汉科技大学Wuhan University of Science and Technology张 凯计算机学院 软件工程系2011年3月12日第第1010章章 内部排序内部排序选择排序(直接排序、堆排序)概述插入排序(直接排序、折半排序、希尔排序)交换排序(冒泡排序、快速排序)归并排序基数排序v选择选择排序排序10.4选择排序选择排序基本思想:第i趟在n-i+1(i=1,2,n-1)个记录中选取关键字最小的记录作为有序序列中的第i个记录。1.简单选择排序2.树形选择排序3.堆排序v简单简单选择排序选择排序10.4选择排序选择排序排序过程:u首先通过n 1次关键字比较,从n个记录中找出关键字最
2、小的记录,将它与第一个记录交换。u再通过n 2次比较,从剩余的n1个记录中找出关键字次小的记录,将它与第二个记录交换。u重复上述操作,共进行n1趟排序后,排序结束。v简单简单选择排序选择排序10.4选择排序选择排序例:初始:49386597761327jjjjjjki=11349一趟:13386597764927i=2二趟:13276597764938三趟:13273897764965四趟:13273849769765五趟:13273849659776六趟:13273849657697排序结束:六趟:13273849657697kki=6i=3i=4i=5比较次数n-1n-2n-6v简单简单选
3、择排序算法描述选择排序算法描述10.4选择排序选择排序voidSelectSort(SqList&L)/对顺序表L作简单选择排序for(i=1;iL.length;+i)k=i;for(j=i+1;j=n;j+)if(L.rj.keyL.rk.key)k=j;if(i!=k)L.riL.rk;/与第i个记录交换/SelectSortv简单简单选择排序算法分析选择排序算法分析10.4选择排序选择排序由于存在着不相邻元素之间的互换,因此,简单选择排序是“不稳定的”。算法实现共需要进行n-1次选择,每次选择需要进行n-i次比较(1in-1),而每次交换最多需3次移动,因此,总的比较次数C=n(n-1
4、)/2,总的移动次数M=3(n-1)。故其时间复杂度为O(n2)。空间效率:O(1)交换时用到一个暂存单元v树形选择树形选择排序排序(又称又称锦标赛排序锦标赛排序)10.4选择排序选择排序基本思想:与体育比赛时的淘汰赛类似。首先对n 个记录的关键字进行两两比较,得到n/2个优胜者(关键字小者),作为第一步比较的结果保留下来。然后在这n/2个较小者之间再进行两两比较,如此重复,直到选出最小关键字的记录为止。例:关键字序列T=(21,25,49,25*,16,08,63),请给出锦标赛排序的具体实现过程。08Winner(胜者)2108086325*2121254925*160863r1注:为便于
5、自动处理,建议每个记录多开两个特殊分量:keyotherinfoIndex(结点位置编号)结点位置编号)Tag(是否参加比较)(是否参加比较)初态补足2k(k=log2n)个叶子结点第一趟:Tree8Tree9Tree10Tree11Tree12Tree13Tree14Tree15第二趟:082108086325*2121254925*160863161616r2Winner(胜者)求次小值16时,只需比较2次,即只比较log2n-1次。令其Tag0,不参与比较令其Tag0,不参与比较第三趟:162116166325*2121254925*160863r3Winner(胜者)632108210
6、8086325*2121254925*1608636321第四趟:r4Winner(胜者)252525082108086325*2121254925*1608631616166321252525第五趟:r5Winner(胜者)25*25*082108086325*2121254925*160863161616632125252525*25*第六趟:r6Winner(胜者)494949082108086325*2121254925*160863161616632125252525*25*494949第七趟:r7Winner(胜者)63v树形选择排序树形选择排序算法算法10.4选择排序选择排序胜者
7、树数据结点类的定义DataNodeTypedata;/数据值intindex;/结点在满二叉树中顺序号intactive;/参选标志:=1,参选,=0,不参选锦标赛排序的锦标赛排序的算法算法voidTournamentSort(Typea,intn)intbottomRowSize=PowerOfTwo(n);/乘幂值计算满足n的2的最小次幂的数intTreeSize=2*bottomRowSize-1;/总结点个数intloadindex=bottomRowSize-1;/内结点个数DataNodetreeTreeSize;intj=0;/从a向胜者树外结点复制数据for(inti=load
8、index;iTreeSize;i+)treei.index=i;if(jn)treei.active=1;treei.data=aj+;elsetreei.active=0;i=loadindex;/进行初始比较选择最小的项while(i)j=i;while(j2*i)if(!treej+1.active|treej.datatreej+1.data)/胜者送入双亲tree(j-1)/2=treej;elsetree(j-1)/2=treej+1;j+=2;i=(i-1)/2;/i退到双亲,直到i=0为止for(i=0;in-1;i+)/处理其它n-1个数据ai=tree0.data;/送出
9、最小数据treetree0.index.active=0;/失去参选资格UpdateTree(tree,tree0.index);/调整an-1=tree0.data;/TournamentSort锦标赛排序中的调整算法锦标赛排序中的调整算法voidUpdateTree(DataNode*tree,inti)if(i%2=0)tree(i-1)/2=treei-1;/i偶数,对手左结点elsetree(i-1)/2=treei+1;/i奇数,对手右结点i=(i-1)/2;/向上调整while(i)/直到i=0if(i%2=0)j=i-1;elsej=i+1;if(!treei.active|!
10、treej.active)if(treei.active)tree(i-1)/2=treei;/i可参选,i上elsetree(i-1)/2=treej;/否则,j上else/两方都可参选if(treei.datatreej.data)tree(i-1)/2=treei;/关键码小者上elsetree(i-1)/2=treej;i=(i-1)/2;/i上升到双亲v树形选择排序算法分析树形选择排序算法分析10.4选择排序选择排序锦标赛排序构成的树是满(完全)二叉树,其深度为log2n +1,其中n为待排序元素个数。时间复杂度:O(nlog2n)n个记录各自比较约log2n次空间效率:O(n)胜者
11、树的附加内结点共有n-1个!稳定性:稳定左右结点相同者左为先n=2k=叶子总数v堆排序堆排序10.4选择排序选择排序1.什么是堆?堆的定义:设有n个元素的序列k1,k2,kn,当且仅当满足下述关系之一时,称之为堆。kik2ikik2i+1ki k2ikik2i+1或者i=1,2,n/22.怎样建堆?3.怎样堆排序?解释:如果让满足以上条件的元素序列(k1,k2,kn)顺次排成一棵完全二叉树,则此树的特点是:树中所有结点的值均大于(或小于)其左右孩子,此树的根结点(即堆顶)必最大(或最小)。v堆排序堆排序10.4选择排序选择排序082546495867234561(大根堆)91856676586
12、7234561557例:有序列T1=(08,25,49,46,58,67)和序列T2=(91,85,76,66,58,67,55),判断它们是否“堆”?(小根堆)(小顶堆)(最小堆)(大顶堆)(最大堆)v怎样怎样建堆?建堆?10.4选择排序选择排序将排序码k1,k2,k3,kn表示成一棵完全二叉树,然后从第n/2个排序码(即最右边的非终端结点)开始筛选,使由该结点作为根结点组成的子二叉树符合堆的定义,然后从第n/2-1个排序码重复刚才操作,直到第一个排序码(即根)止。这时候,该二叉树符合堆的定义,初始堆已经建立。v怎样怎样建堆?建堆?10.4选择排序选择排序212525491608123456
13、例:关键字序列T=(21,25,49,25,16,08),请建大根堆为便于理解,先将原始序列画成完全二叉树的形式21i=3:49而且21还应当向下比较!i=1:21小于25和49,要调整!49大于08,不必调整;i=2:25大于等于25和16,不必调整;完全二叉树的最右一个非终端结点编号必为n/2!(性质5)注:终端结点(即叶子)没有任何子女,无需单独调整。v怎样怎样建堆?建堆?10.4选择排序选择排序这个自堆顶至叶子的调整过程称为“筛选”。筛选:假若完全二叉树的某一个结点i,它的左、右子树已是堆。需要将R2i.key与R2i+1.key之中的最小者与Ri.key比较,若Ri.key较大则交换
14、,这有可能破坏下一级堆。于是继续采用上述方法构造下一级堆,直到完全二叉树中结点i构成堆为止。v怎样怎样建堆?建堆?10.4选择排序选择排序v怎样怎样建堆?建堆?10.4选择排序选择排序voidHeapAdjust(SqListH,ints,intm)/已知H.rs.m中记录的关键字除H.rs.key之外均满足堆的定义,/本函数调整H.rs的关键字,使H.rs.m成为一个大顶堆rc=H.rs;for(j=2*s;j=m;j*=2)/沿key较大的孩子结点向下筛选,j为key较大的记录的下标if(j0;-i)/把H.r1.length建成大顶堆HeapAdjust(H,i,H.length);fo
15、r(i=H.length;i1;-i)/将堆顶记录和当前未经排/序子序列H.r.1.i中最后一个记录相互交换H.r1H.ri;HeapAdjust(H,1,i-1);/将H.R1.i-1重新调整为大顶堆/HeapSortv附附1:基于初始堆进行堆排序的算法:基于初始堆进行堆排序的算法步骤步骤10.4选择排序选择排序1.堆的第一个对象V0具有最大的关键码,将V0与Vn对调,把具有最大关键码的对象交换到最后,再对前面的n-1个对象,使用堆的调整算法,重新建立堆。结果具有次最大关键码的对象又上浮到堆顶,即V0位置。2.再对调V0和Vn-1,调用对前n-2个对象重新调整,如此反复,最后得到全部排序好的
16、对象序列。rc=H.rs;j=2s;jm&H.rj.keyH.rj+1.key+j;/指向右兄弟jH.rj.keyH.rs=H.rj;s=j;j=2*j;/指向左孩子NNNYYYH.rsm中除rs外,其他具有堆特征现调整rs的值,使H.rsm为堆附2:算法流程比较左右孩子大小,j指向大者比较大孩子与rc的大小若大向上浮v堆堆排序的效率分析排序的效率分析10.4选择排序选择排序在整个堆排序中,共需要进行n+n/2-1次筛选运算,每次筛选运算进行双亲和孩子或兄弟结点的排序码的比较和移动次数都不会超过完全二叉树的深度。故每次筛选运算的时间复杂度为O(log2n),则整个堆排序过程的时间复杂度为O(n
17、log2n)。堆排序在最坏情况下,时间复杂度也为O(nlog2n)。相对于快速排序,这是堆排序的最大优点。此外,堆排序仅需一个记录大小辅助存储空间供交换使用。由于存在着不相邻元素之间的互换,因此,堆排序是一种不稳定的排序方法。v堆堆排序的效率分析排序的效率分析10.4选择排序选择排序时间效率:O(nlog2n)。因为整个排序过程中需要调用n-1次HeapAdjust()算法,HeapAdjust()而算法本身耗时为log2n;空间效率:O(1)。仅在第二个for循环中交换记录时用到一个临时变量temp。稳定性:不稳定。优点:对少量数据效果不明显,但对大量数据有效。v归并排序归并排序10.5归并
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 10 排序 选择 归并 基数排序

限制150内