数据结构(C++描述)电子教案第9章.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《数据结构(C++描述)电子教案第9章.ppt》由会员分享,可在线阅读,更多相关《数据结构(C++描述)电子教案第9章.ppt(57页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第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女例如,在表
2、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,张丽娟),(9900
3、5,周涛)当然,我们还可以按排序码性别来进行递增排序,在此不再作进一步的分析。9.1.2 基本概念基本概念1排序码(SortKey)作为排序依据的记录中的一个属性。它可以是任何一种可比的有序数据类型,它可以是记录的关键字,也可以是任何非关键字。如上例中的学生年龄。在此我们认为对任何一种记录都可找到一个取得它排序码的函数Skey(一个或个关键字的组合)。2有序表与无序表有序表与无序表一组记录按排序码的递增或递减次序排列得到的结果被称之为有序表,相应地,把排序前的状态称为无序表。3正序表与逆序表正序表与逆序表若有序表是按排序码升序排列的,则称为升序表或正序表,否则称为降序表或逆序表。不失普遍性,我
4、们一般只讨论正序表。4排序定义排序定义若给定一组记录序列r1,r2,rn,其排序码分别为s1,s2,sn,将这些记录排成顺序为rk1,rk2,rkn的一个序列R,满足条件sk1sk2skn,获得这些记录排成顺序为rp1,rp2,rpn的一个序列R”,满足条件sp1sp2spn的过程称为排序。也可以说,将一组记录按某排序码递增或递减排列的过程,称为排序。5稳定与不稳定稳定与不稳定因为排序码可以不是记录的关键字,同一排序码值可能对应多个记录。对于具有同一排序码的多个记录来说,若采用的排序方法使排序后记录的相对次序不变,则称此排序方法是稳定的,否则称为不稳定的。在上例中(见表9-1,按年龄排序),如
5、果一种排序方法使排序后的结果必为前一个结果,则称此方法是稳定的;若一种排序方法使排序后的结果可能为后一个结果,则称此方法是不稳定的。6内排序与外排序内排序与外排序按照排序过程中使用内外存的不同将排序方法分为内排序和外排序。若排序过程全部在内存中进行,则称为内排序;若排序过程需要不断地进行内存和外存之间的数据交换,则称为外排序。内排序大致可分为五类:插入排序、交换排序、选择排序、归并排序和分配排序。本章仅讨论内排序。7排序的时间复杂性排序的时间复杂性排序过程主要是对记录的排序码进行比较和记录的移动过程。因此排序的时间复杂性可以算法执行中的数据比较次数及数据移动次数来衡量。当一种排序方法使排序过程
6、在最坏或平均情况下所进行的比较和移动次数越少,则认为该方法的时间复杂性就越好,分析一种排序方法,不仅要分析它的时间复杂性,而且要分析它的空间复杂性、稳定性和简单性等。为了以后讨论方便,我们直接将排序码写成一个一维数组的形式,具体类型设为Elemtype,并且在没有声明的情形下,所有排序都按排序码的值递增排列。排序排序插入排序(直插排序、二分排序、希尔排序)交换排序(冒泡排序、快速排序)选择排序(直选排序、树型排序、堆排序)归并排序(二路归并排序、多路归并排序)分配排序(多关键字排序、基数排序)92插入排序 9.2.1直接插入排序直接插入排序1直接插入排序的基本思想直接插入排序(Straight
7、InsertionSorting)的基本思想是:把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。它的直接
8、插入排序的执行过程如图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+
9、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二分插入排序的效率分析二分插入排序的效率分析二分插入算法与直接插
10、入算法相比,需要辅助空间与直接插入排序基本一致;时间上,前者的比较次数比直接插入查找的最坏情况好,最好的情况坏,两种方法的元素的移动次数相同,因此二分插入排序的时间复杂度仍为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;/
11、取中点if(temp=left;j-)Rj+1=Rj;/元素后移空出插入位Rleft=temp;9.2.3希尔排序希尔排序1希尔排序的基本思想希尔排序的基本思想希尔排序(ShellSort)又称为“缩小增量排序”。是1959年由D.L.Shell提出来的。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。3希尔排序的效率分析希尔排序的效率
12、分析虽然我们给出的算法是三层循环,最外层循环为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,则希尔排序的结果变
13、成2,2,3,4。93 交换排序交换排序9.3.1 冒泡排序冒泡排序1冒泡排序的基本思想冒泡排序(BubbleSorting)的基本思想是:是通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的排序码,若发现逆序则交换,使排序码较小的元素逐渐从后部移向前部(从下标较大的单元移向下标较小的单元),就象水底下的气泡一样逐渐向上冒。因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。2冒泡排序的算法实现冒泡排序的算法实现下面给出冒泡排序算法。voidBubble
14、sort(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,即没进行交换,所以不必进行第四趟排序。从冒泡排序的算法可以看出,若待排序的元素为
15、正序,则只需进行一趟排序,比较次数为(n-1)次,移动元素次数为0;若待排序的元素为逆序,则需进行n-1趟排序,比较次数为(n2-n)/2,移动次数为3(n2-n)/2,因此冒泡排序算法的时间复杂度为O(n2)。由于其中的元素移动较多,所以属于内排序中速度较慢的一种。因为冒泡排序算法只进行元素间的顺序移动,所以是一个稳定的算法。9.3.2 快速排序快速排序1快速排序的基本思想快速排序(QuickSorting)是迄今为止所有内排序算法中速度最快的一种。它的基本思想是:任取待排序序列中的某个元素作为基准(一般取第一个元素),通过一趟排序,将待排元素分为左右两个子序列,左子序列元素的排序码均小于或
16、等于基准元素的排序码,右子序列的排序码则大于基准元素的排序码,然后分别对两个子序列继续进行排序,直至整个序列有序。快速排序是对冒泡排序的一种改进方法,算法中元素的比较和交换是从两端向中间进行的,排序码较大的元素一次就能够交换到后面单元,排序码较小的记录一次就能够交换到前面单元,记录每次移动的距离较远,因而总的比较和移动次数较少。快速排序的过程为:把待排序区间按照第一个元素(即基准元素)的排序码分为左右两个子序列的过程叫做一次划分。设待排序序列为RleftRright,其中left为下限,right为上限,leftright,Rleft为该序列的基准元素,为了实现一次划分,令i,j的初值分别为l
17、eft和right。在划分过程中,首先让j从它的初值开始,依次向前取值,并将每一元素Rj的排序码同Rleft的排序码进行比较,直到RjRleft时,交换Rj与Rleft的值,使排序码相对较小的元素交换到左子序列,然后让i从i1开始,依次向后取值,并使每一元素Ri的排序码同Rj的排序码(此时Rj为基准元素)进行比较,直到RiRj时,交换Ri与Rj的值,使排序码大的元素交换到后面子区间;再接着让j从j-1开始,依次向前取值,重复上述过程,直到i等于j,即指向同一位置为止,此位置就是基准元素最终被存放的位置。此次划分得到的前后两个待排序的子序列分别为RleftRi-1和Ri+1Rright。例如,给
18、定排序码为:(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;i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 C+ 描述 电子 教案
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内