欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    数据结构(C++描述)电子教案第9章.ppt

    • 资源ID:67583348       资源大小:675.50KB        全文页数:57页
    • 资源格式: PPT        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    数据结构(C++描述)电子教案第9章.ppt

    第第9 9章章 排序排序 数据结构(C+描述)目录91 基本概念基本概念92插入排序93 交换排序交换排序94选择排序95归并排序*9.6 分配排序分配排序退出91 基本概念基本概念9.1.1排序介绍排序(Sorting)是数据处理中一种很重要的运算,同时也是很常用的运算,一般数据处理工作25%的时间都在进行排序。简单地说,排序就是把一组记录(元素)按照某个域的值的递增(即由小到大)或递减(即由大到小)的次序重新排列的过程。表9-1学生档案表学号姓名年龄性别99001王晓佳18男99002林一鹏19男99003谢宁17女99004张丽娟18女99005周涛20男99006李小燕16女例如,在表9-1中,若以每个记录的学号为关键字,按排序码年龄的递增(由小到大)排序,则所有记录的排序结果可简记为:(99006,16),(99003,17),(99001,18),(99004,18),(99002,19),(99005,20);也可能为:(99006,16),(99003,17),(99004,18),(99001,18),(99002,19),(99005,20);这两个结果都是表9-1按年龄的递增排序结果。若按排序码姓名来进行递增排序,则得到的排序结果为:(99006,李小燕),(99002,林一鹏),(99001,王晓佳),(99003,谢宁),(99004,张丽娟),(99005,周涛)当然,我们还可以按排序码性别来进行递增排序,在此不再作进一步的分析。9.1.2 基本概念基本概念1排序码(SortKey)作为排序依据的记录中的一个属性。它可以是任何一种可比的有序数据类型,它可以是记录的关键字,也可以是任何非关键字。如上例中的学生年龄。在此我们认为对任何一种记录都可找到一个取得它排序码的函数Skey(一个或个关键字的组合)。2有序表与无序表有序表与无序表一组记录按排序码的递增或递减次序排列得到的结果被称之为有序表,相应地,把排序前的状态称为无序表。3正序表与逆序表正序表与逆序表若有序表是按排序码升序排列的,则称为升序表或正序表,否则称为降序表或逆序表。不失普遍性,我们一般只讨论正序表。4排序定义排序定义若给定一组记录序列r1,r2,rn,其排序码分别为s1,s2,sn,将这些记录排成顺序为rk1,rk2,rkn的一个序列R,满足条件sk1sk2skn,获得这些记录排成顺序为rp1,rp2,rpn的一个序列R”,满足条件sp1sp2spn的过程称为排序。也可以说,将一组记录按某排序码递增或递减排列的过程,称为排序。5稳定与不稳定稳定与不稳定因为排序码可以不是记录的关键字,同一排序码值可能对应多个记录。对于具有同一排序码的多个记录来说,若采用的排序方法使排序后记录的相对次序不变,则称此排序方法是稳定的,否则称为不稳定的。在上例中(见表9-1,按年龄排序),如果一种排序方法使排序后的结果必为前一个结果,则称此方法是稳定的;若一种排序方法使排序后的结果可能为后一个结果,则称此方法是不稳定的。6内排序与外排序内排序与外排序按照排序过程中使用内外存的不同将排序方法分为内排序和外排序。若排序过程全部在内存中进行,则称为内排序;若排序过程需要不断地进行内存和外存之间的数据交换,则称为外排序。内排序大致可分为五类:插入排序、交换排序、选择排序、归并排序和分配排序。本章仅讨论内排序。7排序的时间复杂性排序的时间复杂性排序过程主要是对记录的排序码进行比较和记录的移动过程。因此排序的时间复杂性可以算法执行中的数据比较次数及数据移动次数来衡量。当一种排序方法使排序过程在最坏或平均情况下所进行的比较和移动次数越少,则认为该方法的时间复杂性就越好,分析一种排序方法,不仅要分析它的时间复杂性,而且要分析它的空间复杂性、稳定性和简单性等。为了以后讨论方便,我们直接将排序码写成一个一维数组的形式,具体类型设为Elemtype,并且在没有声明的情形下,所有排序都按排序码的值递增排列。排序排序插入排序(直插排序、二分排序、希尔排序)交换排序(冒泡排序、快速排序)选择排序(直选排序、树型排序、堆排序)归并排序(二路归并排序、多路归并排序)分配排序(多关键字排序、基数排序)92插入排序 9.2.1直接插入排序直接插入排序1直接插入排序的基本思想直接插入排序(StraightInsertionSorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。2直接插入的算法实现voidinsertsort(ElemTypeR,intn)/待排序元素用一个数组R表示,数组有n个元素for(inti=1;i=0)&(tempRj)Rj+1=Rj;j-;/顺序比较和移动Rj+1=temp;例如,n=6,数组R的六个排序码分别为:17,3,25,14,20,9。它的直接插入排序的执行过程如图9-1所示。3直接插入排序的效率分析直接插入排序的效率分析从上面的叙述可以看出,直接插入排序算法十分简单。那么它的效率如何呢?首先从空间来看,它只需要一个元素的辅助空间,用于元素的位置交换。从时间分析,首先外层循环要进行n-1次插入,每次插入最少比较一次(正序),移动两次;最多比较i次,移动i2次(逆序)(i=1,2,n-1)。若分别用Cmin,Cmax和Cave表示元素的总比较次数的最小值、最大值和平均值,用Mmin,Mmax和Mave表示元素的总移动次数的最小值、最大值和平均值,则上述直接插入算法对应的这些量为:Cmin=n-1Mmin=2(n-1)Cmax=1+2+n-1=(n2-n)/2Mmax=3+4+n+1=(n2+3n-4)/2Cave=(n2+n-2)/4Mmax=(n2+7n-8)/4因此,直接插入排序的时间复杂度为O(n2)。直接插入算法的元素移动是顺序的,该方法是稳定的。9.2.2二分插入排序二分插入排序1二分插入排序的基本思想二分插入排序的基本思想二分插入排序(BinaryInsertSort)的基本思想是:在有序表中采用二分查找的方法查找待排元素的插入位置。其处理过程:先将第一个元素作为有序序列,进行n-1次插入,用二分查找的方法查找待排元素的插入位置,将待排元素插入。3二分插入排序的效率分析二分插入排序的效率分析二分插入算法与直接插入算法相比,需要辅助空间与直接插入排序基本一致;时间上,前者的比较次数比直接插入查找的最坏情况好,最好的情况坏,两种方法的元素的移动次数相同,因此二分插入排序的时间复杂度仍为O(n2)。二分插入算法与直接插入算法的元素移动一样是顺序的,因此该方法也是稳定的。2二分插入排序的算法实现二分插入排序的算法实现其算法如下:voidBinaryInsertSort(ElemTypeR,intn)for(inti=1;in;i+)/共进行n-1次插入intleft=0,right=i-1;ElemTypetemp=Ri;while(left=right)intmiddle=(left+right)/2;/取中点if(temp=left;j-)Rj+1=Rj;/元素后移空出插入位Rleft=temp;9.2.3希尔排序希尔排序1希尔排序的基本思想希尔排序的基本思想希尔排序(ShellSort)又称为“缩小增量排序”。是1959年由D.L.Shell提出来的。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。3希尔排序的效率分析希尔排序的效率分析虽然我们给出的算法是三层循环,最外层循环为log2n数量级,中间的for循环是n数量级的,内循环远远低于n数量级,因为当分组较多时,组内元素较少;此循环次数少;当分组较少时,组内元素增多,但已接近有序,循环次数并不增加。因此,希尔排序的时间复杂性在O(nlog2n)和O(n2)之间,大致为O(n1.3)。例如,n=8,数组R的八个元素分别为:17,3,30,25,14,17,20,9。下面用图9-2给出希尔排序算法的执行过程。由于希尔排序对每个子序列单独比较,在比较时进行元素移动,有可能改变相同排序码元素的原始顺序,因此希尔排序是不稳定的。例如,给定排序码3,4,2,2,则希尔排序的结果变成2,2,3,4。93 交换排序交换排序9.3.1 冒泡排序冒泡排序1冒泡排序的基本思想冒泡排序(BubbleSorting)的基本思想是:是通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的排序码,若发现逆序则交换,使排序码较小的元素逐渐从后部移向前部(从下标较大的单元移向下标较小的单元),就象水底下的气泡一样逐渐向上冒。因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。2冒泡排序的算法实现冒泡排序的算法实现下面给出冒泡排序算法。voidBubblesort(ElemTypeR,intn)intflag=1;/当flag为0则停止排序for(inti=1;i=i;j-)if(RjRj-1)/发生逆序ElemTypet=Rj;Rj=Rj-1;Rj-1=t;flag=1;/交换,并标记发生了交换if(flag=0)return;例如,n=6,数组R的六个排序码分别为:17,3,25,14,20,9。下面用图9-3给出冒泡排序算法的执行过程。3冒泡排序的效率分析冒泡排序的效率分析从上面的例子可以看出,当进行完第三趟排序时,数组已经有序,所以第四趟排序的交换标志为0,即没进行交换,所以不必进行第四趟排序。从冒泡排序的算法可以看出,若待排序的元素为正序,则只需进行一趟排序,比较次数为(n-1)次,移动元素次数为0;若待排序的元素为逆序,则需进行n-1趟排序,比较次数为(n2-n)/2,移动次数为3(n2-n)/2,因此冒泡排序算法的时间复杂度为O(n2)。由于其中的元素移动较多,所以属于内排序中速度较慢的一种。因为冒泡排序算法只进行元素间的顺序移动,所以是一个稳定的算法。9.3.2 快速排序快速排序1快速排序的基本思想快速排序(QuickSorting)是迄今为止所有内排序算法中速度最快的一种。它的基本思想是:任取待排序序列中的某个元素作为基准(一般取第一个元素),通过一趟排序,将待排元素分为左右两个子序列,左子序列元素的排序码均小于或等于基准元素的排序码,右子序列的排序码则大于基准元素的排序码,然后分别对两个子序列继续进行排序,直至整个序列有序。快速排序是对冒泡排序的一种改进方法,算法中元素的比较和交换是从两端向中间进行的,排序码较大的元素一次就能够交换到后面单元,排序码较小的记录一次就能够交换到前面单元,记录每次移动的距离较远,因而总的比较和移动次数较少。快速排序的过程为:把待排序区间按照第一个元素(即基准元素)的排序码分为左右两个子序列的过程叫做一次划分。设待排序序列为RleftRright,其中left为下限,right为上限,leftright,Rleft为该序列的基准元素,为了实现一次划分,令i,j的初值分别为left和right。在划分过程中,首先让j从它的初值开始,依次向前取值,并将每一元素Rj的排序码同Rleft的排序码进行比较,直到RjRleft时,交换Rj与Rleft的值,使排序码相对较小的元素交换到左子序列,然后让i从i1开始,依次向后取值,并使每一元素Ri的排序码同Rj的排序码(此时Rj为基准元素)进行比较,直到RiRj时,交换Ri与Rj的值,使排序码大的元素交换到后面子区间;再接着让j从j-1开始,依次向前取值,重复上述过程,直到i等于j,即指向同一位置为止,此位置就是基准元素最终被存放的位置。此次划分得到的前后两个待排序的子序列分别为RleftRi-1和Ri+1Rright。例如,给定排序码为:(46,55,13,42,94,05,17,70),具体划分如图9-4所示。从图9-4可知,通过一次划分,将一个区间以基准值分成两个子区间,左子区间的值小于等于基准值,右子区间的值大于基准值。对剩下的子区间重复此划分步骤,则可以得到快速排序的结果。2快速排序的算法实现快速排序的算法实现下面给出快速排序算法的递归算法如下:voidquicksort(ElemTypeR,intleft,intright)inti=left,j=right;ElemTypetemp=Ri;while(itemp)&(ji)j=j-1;if(ji)Ri=Rj;i=i+1;while(Rii)i=i+1;if(ij)Rj=Ri;j=j-1;/一次划分得到基准值的正确位置Ri=temp;if(lefti-1)quicksort(R,left,i-1);/递归调用左子区间if(i+1right)quicksort(R,i+1,right);/递归调用右子区间3快速排序的效率分析快速排序的效率分析若快速排序出现最好的情形(左、右子区间的长度大致相 等),则 结 点 数 n与 二 叉 树 深 度 h应 满 足log2nhlog2n+1,所以总的比较次数不会超过(n+1)log2n。因 此,快 速 排 序 的 最 好 时 间 复 杂 度 应 为O(nlog2n)。而且在理论上已经证明,快速排序的平均时间复杂度也为O(nlog2n)。若快速排序出现最坏的情形(每次能划分成两个子区间,但其中一个是空),则这时得到的二叉树是一棵单分枝树,得到的非空子区间包含有n-i个(i代表二叉树的层数(1in)元素,每层划分需要比较n-i+2次,所以总的比较次数为(n2+3n-4)/2。因此,快速排序的最坏时间复杂度为O(n2)。快速排序所占用的辅助空间为栈的深度,故最好的空间复杂度为O(log2n),最坏的空间复杂度为O(n)。快速排序是一种不稳定的排序方法。94选择排序9.4.1 直接选择排序直接选择排序1直接选择排序的基本思想直接选择排序的基本思想直接选择排序(straightselectsorting)也是一种简单的排序方法。它的基本思想是:第一次从R0Rn-1中选取最小值,与R0交换,第二次从R1Rn-1中选取最小值,与R1交换,第三次从R2Rn-1中选取最小值,与R2交换,第i次从Ri-1Rn-1中选取最小值,与Ri-1交换,,第n-1次从Rn-2Rn-1中选取最小值,与Rn-2交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。例如,给定n=8,数组R中的8个元素的排序码为:(8,3,2,1,7,4,6,5),则直接选择排序过程如图9-5所示。3直接选择排序的效率分析直接选择排序的效率分析在直接选择排序中,共需要进行n-1次选择和交换,每次选择需要进行n-i次比较(1in-1),而每次交换最多需3次移动,因此,总的比较次数C=(n2-n)/2,总的移动次数M=3(n-1)。由此可知,直接选择排序的时间复杂度为O(n2)数量级,所以当记录占用的字节数较多时,通常比直接插入排序的执行速度要快一些。由于在直接选择排序中存在着不相邻元素之间的互换,因此,直接选择排序是一种不稳定的排序方法。例如,给定排序码为3,7,3,2,1,排序后的结果为1,2,3,3,7。9.4.2 树形选择排序树形选择排序从直接选择排序可知,在n个排序码中,找出最小值需n-1次比较,找出第二小值需n-2次比较,找出第三小值需n-3次比较,其余依此类推。所以,总的比较次数为:(n-1)+(n-2)+3+2+1=(n2-n)/2,那么,能否对直接选择排序算法加以改进,使总的比较次数比(n2-n)/2小呢?显然,在n个排序码中选出最小值,至少进行n-1次比较,但是,继续在剩下的n-1个关键字中选第二小的值,就并非一定要进行n-2次比较,若能利用前面n-1次比较所得信息,则可以减少以后各趟选择排序中所用的比较次数,比如8个运动员中决出前三名,不需要7+6+5=18场比赛(前提是,若甲胜乙,而乙胜丙,则认为甲胜丙),最多需要11场比赛即可(通过7场比赛产生冠军后,第二名只能在输给冠军的三个对中产生,需2场比赛,而第三名只能在输给亚军的三个对中产生,也需2场比赛,总共11场比赛)。具体见图9-6所示。从图9-6(a)可知,8个队经过4场比赛,获胜的4个队进入半决赛,再经过2场半决赛和1场决赛即可知道冠军属谁(共7场比赛)按照锦标赛的传递关糸,亚军只能产生于分别在决赛,半决赛和第一轮比赛中输给冠军的选取手中,于是亚军只能在b、c、e这3个队中产生(见图9-6(b),即进行2场比赛(e与c一场,e与c的胜队与b一场)后,即可知道亚军属谁。同理,第三名只需在c、f、g这3个队产生(见图9-6(c)即进2场比赛(f与g一场,f与g的胜队与c一场)即可知道第三名属谁。树形选择排序(treeselectionsorting),又称锦标赛排序(tournamentsorting),是一种按照锦标赛的思想进行选择排序的方法。首先对n个记录的排序码进行两两比较,然后在其中n/2个较小者之间再进行两两比较,如此重复,直到选出最小排序码为止。例如,给定排序码头50,37,66,98,75,12,26,49,树形选择排序过程见图9-7。9.4.3 堆排序堆排序1堆的定义堆的定义若有n个元素的排序码k1,k2,k3,kn,当满足如下条件:kik2ikik2i(1)kik2i+1或(2)kik2i+1其中i=1,2,n/2则称此n个元素的排序码k1,k2,k3,kn为一个堆。若将此排序码按顺序组成一棵完全二叉树,则(1)称为小根堆(二叉树的所有根结点值小于或等于左右孩子的值),(2)称为大根堆(二叉树的所有根结点值大于或等于左右孩子的值)。若n个元素的排序码k1,k2,k3,kn满足堆,且让结点按1、2、3、n顺序编号,根据完全二叉树的性质(若i为根结点,则左孩子为2i,右孩子为2i+1)可知,堆排序实际与一棵完全二叉树有关。若将排序码初始序列组成一棵完全二叉树,则堆排序可以包含建立初始堆(使排序码变成能符合堆的定义的完全二叉树)和利用堆进行排序两个阶段。2堆排序的基本思想堆排序的基本思想将排序码k1,k2,k3,kn表示成一棵完全二叉树,然后从第n/2个排序码开始筛选,使由该结点作根结点组成的子二叉树符合堆的定义,然后从第n/2-1个排序码重复刚才操作,直到第一个排序码止。这时候,该二叉树符合堆的定义,初始堆已经建立。接着,可以按如下方法进行堆排序:将堆中第一个结点(二叉树根结点)和最后一个结点的数据进行交换(k1与kn),再将k1kn-1重新建堆,然后k1和kn-1交换,再将k1kn-2重新建堆,然后k1和kn-2交换,如此重复下去,每次重新建堆的元素个数不断减1,直到重新建堆的元素个数仅剩一个为止。这时堆排序已经完成,则排序码k1,k2,k3,kn已排成一个有序序列。若排序是从小到大排列,则可以用建立大根堆实现堆排序,若排序是从大到小排列,则可以用建立小根堆实现堆排序。例如,给定排序码46,55,13,42,94,05,17,70,建立初始堆的过程如图9-8所示。对排序码46,55,13,42,94,05,17,70,建成如图9-8(e)所示的大根堆后,堆排序过程如图9-9所示。从图9-9(n)可知,将其结果按完全二叉树形式输出,则得到结果为:05,13,17,42,46,55,70,94,即为堆排序的结果。4堆排序的效率分析堆排序的效率分析在整个堆排序中,共需要进行n+n/2-1次筛选运算,每次筛选运算进行双亲和孩子或兄弟结点的排序码的比较和移动次数都不会超过完全二叉树的深度,所以,每次筛选运算的时间复杂度为O(log2n),故整个堆排序过程的时间复杂度为O(nlog2n)。堆排序占用的辅助空间为1(供交换元素用),故它的空间复杂度为O(1)。堆排序是一种不稳定的排序方法,例如,给定排序码:2,1,2,它的排序结果为:1,2,2。95归并排序9.5.1 二路归并排序二路归并排序二路归并排序的基本思想二路归并排序的基本思想是:将两个有序子区间(有序表)合并成一个有序子区间,一次合并完成后,有序子区间的数目减少一半,而区间的长度增加一倍,当区间长度从1增加到n(元素个数)时,整个区间变为一个,则该区间中的有序序列即为我们所需的排序结果。例如,给定排序码46,55,13,42,94,05,17,70,二路归并排序过程如图9-10所示。3二路归并排序的效率分析二路归并排序的效率分析二路归并排序的时间复杂度等于归并趟数与每一趟时间复杂度的乘积。而归并趟数为log2n(当log2n为奇数时,则为log2n+1)。因为每一趟归并就是将两两有序子区间合并成一个有序子区间,而每一对有序子区间归并时,记录的比较次数均小于等于记录的移动次数(即由一个数组复制到另一个数组中的记录个数),而记录的移动次数等于这一对有序表的长度之和,所以,每一趟归并的移动次数均等于数组中记录的个数n,即每一趟归并的时间复杂度为O(n)。因此,二路归并排序的时间复杂度为O(nlog2n)。利用二路归并排序时,需要利用与待排序数组相同的辅助数组作临时单元,故该排序方法的空间复杂度为O(n),比前面介绍的其它排序方法占用的空间大。由于二路归并排序中,每两个有序表合并成一个有序表时,若分别在两个有序表中出现有相同排序码,则会使前一个有序表中相同排序码先复制,后一有序表中相同排序码后复制,从而保持它们的相对次序不会改变。所以,二路归并排序是一种稳定的排序方法。*9.5.2 多路归并排序多路归并排序将三个或三个以上有序子区间合并成一个有序子区间的排序,称为多路归并排序。常见的有三路归并排序(三个有序子区间合并成一个有序子区间)、四路归并排序(四个有序子区间合并成一个有序子区间)等,具体实现的方法与二路归并排序类似,在此,不再赘述。*9.6 分配排序分配排序9.6.1 多关键字排序多关键字排序在实际应用中,有时的排序会需要按几种不同排序码来排序。例如,描述一个单位的职工信息,既要按出生日期排序,又要按工资排序,则是一种典型的多关键字排序。又如,将一副扑克牌中52张牌按从小到大排列,(规定花色大小为:梅花方块红桃黑桃,面值大小规定为:23410JQKA),则一副扑克牌的排序也是多关键字排序。对于多关键字排序(假设有d个关键字),则可以按第1、2、d个关键字的顺序排序,也可以按第d、d-1、d-2、2、1个关键字的顺序排序。例如,刚才的扑克牌排序,可以先按花色排成4堆,然后将每一堆再按面值排序,则可以得到52张牌的有序序列。具体实现不再介绍。9.6.2链式基数排序链式基数排序1基数排序的基本思想基数排序(radixsorting)是和前面所述各类排序方法完全不同的一种排序方法。在前面几节中,实现排序主要是通过排序码之间的比较和移动两项操作来进行的,而基数排序不需要进行排序码的比较,它是一种借助多关键字(多个排序码)排序的思想来实现单关键字排序的排序方法。具体实现时,假设每个元素有d个排序码,则可以先按第1个排序码对每个元素排序,然后再按第2个排序码排序,最后再按第d个排序码排序。最后的结果即为基数排序的结果。例如,给定排序码序列123,78,65,9,108,7,8,3,68,309,基数排序的步骤见图9-11。具体实现时,基数排序包含分配和收集,分配是将第k(1kd)个排序码相同的元素放到一个队列中(按第k个排序码排序),收集是得到这一趟的排序结果。例如,对刚才图9-11的初始排序码,分配和收集过程见图9-12。3.基数排序的效率分析对于含有n个元素的关键字(每个关键字有d个排序码,每个排序码的取值范围从c1到crd),每一趟分配和收集的时间复杂度为O(n+crd-c1+1),由于有d个排序码,故需进行d趟分配和收集,因此,基数排序的时间复杂度为O(d(n+crd-c1+1)。在基数排序中,由于每个排序码的取值范围从c1到crd,故需要crd-c1+1个队头和队尾指针,故它的空间复杂度为O(n+crd-c1+1)。由于基数排序中值相同的元素的相对位置在分配和收集中,不会发生变化,所以基数排序是一种稳定的排序方法。97 各种内排序方法的比较和选择各种内排序方法的比较和选择9.7.1 各种内排序方法的比较各种内排序方法的比较1从时间复杂度比较从时间复杂度比较从平均时间复杂度来考虑,直接插入排序、冒泡排序、直接选择排序是三种简单的排序方法,时间复杂度都为O(n2),而快速排序、堆排序、二路归并排序的时间复杂度都为O(nlog2n),希尔排序的复杂度介于这两者之间。若从最好的时间复杂度考虑,则直接插入排序和冒泡排序的时间复杂度最好,为O(n),其它的最好情形同平均情形相同。若从最坏的时间复杂度考虑,则快速排序的为O(n2),直接插入排序、冒泡排序、希尔排序同平均情形相同,但系数大约增加一倍,所以运行速度将降低一半,最坏情形对直接选择排序、堆排序和归并排序影响不大。2从空间复杂度比较从空间复杂度比较归并排序的空间复杂度最大,为O(n),快速排序的空间复杂度为O(log2n),其它排序的空间复杂度为O(1)。3.从稳定性比较直接插入排序、冒泡排序、归并排序是稳定的排序方法,而直接选择排序、希尔排序、快速排序、堆排序是不稳定的排序方法。4从算法简单性比较从算法简单性比较直接插入排序、冒泡排序、直接选择排序都是简单的排序方法,算法简单,易于理解,而希尔排序、快速排序、堆排序、归并排序都是改进型的排序方法,算法比简单排序要复杂得多,也难于理解。9.7.2 各种内排序方法的选择各种内排序方法的选择1从时间复杂度选择从时间复杂度选择对元素个数较多的排序,可以选快速排序、堆排序、归并排序,元素个数较少时,可以选简单的排序方法。2从空间复杂度选择从空间复杂度选择尽量选空间复杂度为O(1)的排序方法,其次选空间复杂度为O(log2n)的快速排序方法,最后才选空间复杂度为O(n)二路归并排序的排序方法。3一般选择规则一般选择规则(1)当待排序元素的个数n较大,排序码分布是随机,而对稳定性不做要求时,则采用快速排序为宜。(2)当待排序元素的个数n大,内存空间允许,且要求排序稳定时,则采用二路归并排序为宜。(3)当待排序元素的个数n大,排序码分布可能会出现正序或逆序的情形,且对稳定性不做要求时,则采用堆排序或二路归并排序为宜。(4)当待排序元素的个数n小,元素基本有序或分布较随机,且要求稳定时,则采用直接插入排序为宜。(5)当待排序元素的个数n小,对稳定性不做要求时,则采用直接选择排序为宜,若排序码不接近逆序,也可以采用直接插入排序。冒泡排序一般很少采用。

    注意事项

    本文(数据结构(C++描述)电子教案第9章.ppt)为本站会员(s****8)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开