第8章-排序要点.ppt
《第8章-排序要点.ppt》由会员分享,可在线阅读,更多相关《第8章-排序要点.ppt(69页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第八章第八章 排序排序DS应用实践应用实践插入排序插入排序 基数排序基数排序归并排序归并排序交换排序交换排序选择排序选择排序Hot Tip 本章学习的要点主要是了解各种排序方法实现时所依据的原则以及它们的主要操作(关键字间的比较和记录的移动)的时间分析。学习中应注意掌握各种排序方法实现的要点,切实掌握各种排序过程的排序特点所在。8.1基本概念基本概念v排序排序(Sorting)定义:是将一个数据元素(或定义:是将一个数据元素(或记记录)录)的任意序列,重新排列成一个按的任意序列,重新排列成一个按关键字关键字有序的序列。有序的序列。v关键字:数据元素中的某个数据项。关键字:数据元素中的某个数据项
2、。内部排序内部排序:待排序的记录存放在计算机随机存储器中进:待排序的记录存放在计算机随机存储器中进行的排序过程。行的排序过程。外部排序外部排序:待排序记录的数量很大,以致内存一次不能:待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中尚需对外存进行访问的排容纳全部记录,在排序过程中尚需对外存进行访问的排序过程。序过程。493865977613274913273849496576971327384949657697方法一:方法一:方法二:方法二:原始序列:原始序列:假设假设Ki=Kj(ij),且在排序前的序列中且在排序前的序列中Ri领先于领先于Rj(即即i8?8?8?5791013
3、14845213905514131098Ri这方法简单易懂,但效率不高,比如将下一元素这方法简单易懂,但效率不高,比如将下一元素45插入到当前的有插入到当前的有序表。如果将当前待插入的元素序表。如果将当前待插入的元素Ri与有序区中的元素从后往前进与有序区中的元素从后往前进行比较,若行比较,若RiRi-1则停止比较,则停止比较,Ri呆在原位不动即可呆在原位不动即可;若若RiRi-1则继续往前进行比较,且进行比较的同时将被比较过的则继续往前进行比较,且进行比较的同时将被比较过的元素后移一位置,直到元素后移一位置,直到Ri大于其中某一元素大于其中某一元素Rk为止,为止,Ri则插入则插入到到Rk+1的
4、位置上。的位置上。voidInsertSort(SqList*L)inti,j;for(i=2;ilength;i+)if(L-riri-1)L-r0=L-ri;/设置哨兵设置哨兵for(j=i-1;L-rjL-r0;j-)L-rj+1=L-rj;L-rj+1=L-r0;例例49386597761327i=2(49)386597761327i=1()4938R038j例例49386597761327i=2(4938)6597761327i=3(3849)6597761327i=4(384965)97761327i=5(38496597)761327i=613(133849657697)27i=
5、1()i=7(13273849657697)279776R0766597voidInsertSort(SqList*L)inti,j;for(i=2;ilength;i+)if(L-riri-1)L-r0=L-ri;/设置哨兵设置哨兵for(j=i-1;L-rjL-r0;j-)L-rj+1=L-rj;L-rj+1=L-r0;算法算法8.1直接插入排序直接插入排序算法简单、容易实现,只需要一个记录直接插入排序算法简单、容易实现,只需要一个记录大小的辅助空间用于存放待插入的记录(在大小的辅助空间用于存放待插入的记录(在C语言中,我语言中,我们利用了数组中的们利用了数组中的0单元)和两个单元)和两个
6、int型变量。当待排序记型变量。当待排序记录较少时,排序速度较快,但是,当待排序的记录数量较录较少时,排序速度较快,但是,当待排序的记录数量较大时,大量的比较和移动操作将使直接插入排序算法的效大时,大量的比较和移动操作将使直接插入排序算法的效率降低;然而,当待排序的数据元素基本有序时,直接插率降低;然而,当待排序的数据元素基本有序时,直接插入排序过程中的移动次数大大减少,从而效率会有所提高。入排序过程中的移动次数大大减少,从而效率会有所提高。插入排序是一种稳定的排序方法。插入排序是一种稳定的排序方法。当待排记录处于当待排记录处于正序正序(即记录按关键字从小到大的即记录按关键字从小到大的顺序排列
7、顺序排列)的情况时,所需进行的关键字比较和记录移动的情况时,所需进行的关键字比较和记录移动的次数最少,反之,当待排记录处于的次数最少,反之,当待排记录处于逆序逆序(即记录按关即记录按关键字从大到小的顺序排列键字从大到小的顺序排列)的情况时,所需进行的关键字的情况时,所需进行的关键字比较和记录移动的次数最多,如下表所列。比较和记录移动的次数最多,如下表所列。待排记录序列处于随机状态,则可以最坏和最好的情待排记录序列处于随机状态,则可以最坏和最好的情况的平均值作为插入排序的时间性能的量度。一般情况下,况的平均值作为插入排序的时间性能的量度。一般情况下,直接插入排序的时间复杂度为直接插入排序的时间复
8、杂度为O(n2)。v希尔排序希尔排序(ShellSort)又称为又称为“缩小增量排序缩小增量排序”(DiminishingIncrementSort)v基本思想:先将整个待排记录分割成为若干个子序列基本思想:先将整个待排记录分割成为若干个子序列分别进行直分别进行直 接插入排序,待整个序列中的记录接插入排序,待整个序列中的记录“基本有基本有序序”时,再对全体记录进行一次直接插入排序。时,再对全体记录进行一次直接插入排序。8.2.3希尔排序希尔排序v具体步骤具体步骤 假假设设待待排排序序的的记记录录为为n个个,先先取取整整数数dR2,则交换;然后比较第二则交换;然后比较第二个记录与第三个记录;依次
9、类推,直至第个记录与第三个记录;依次类推,直至第n-1个记录个记录和第和第n个记录比较为止个记录比较为止第一趟冒泡排序第一趟冒泡排序,结果,结果关键字最大的记录被安置在最后一个记录上关键字最大的记录被安置在最后一个记录上对前对前n-1个记录进行第二趟冒泡排序,结果使关键字个记录进行第二趟冒泡排序,结果使关键字次大的记录被安置在第次大的记录被安置在第n-1个记录位置个记录位置重复上述过程,直到重复上述过程,直到“在一趟排序过程中没有进行在一趟排序过程中没有进行过交换记录的操作过交换记录的操作”为止为止 用冒泡排序算法用冒泡排序算法对数据表数据表A=(12,5,4,9,5)从小到从小到大大进行排序
10、。行排序。解:9559445512 412595124512594512125945912125voidBubbleSortC(SqList*L)inti,j;for(i=1;ilength;i+)for(j=L-length-1;j=i;j-)if(L-rjL-rj+1)swap(L,j,j+1);/交换交换j与与j+1的值的值voidBubbleSortC(SqList*L)inti,j;intflag=TRUE;for(i=1;ilength&flag;i+)flag=FALSE;for(j=L-length-1;j=i;j-)if(L-rjL-rj+1)swap(L,j,j+1);/交
11、换交换j与与j+1的值的值flag=TRUE;/有数据交换,循环继续有数据交换,循环继续算法评价算法评价时间复杂度时间复杂度最好情况(正序)最好情况(正序)Y比较次数:比较次数:n-1Y移动次数:移动次数:012345最坏情况(逆序)最坏情况(逆序)Y比较次数:比较次数:Y移动次数:移动次数:空间复杂度:空间复杂度:S(n)=O(1)T(n)=O(n)54321v冒泡排序比较简单,当初始序列基本有序时,冒泡冒泡排序比较简单,当初始序列基本有序时,冒泡排序有较高的效率,反之效率较低;其次冒泡排序排序有较高的效率,反之效率较低;其次冒泡排序只需要一个记录的辅助空间,用来作为记录交换的只需要一个记录
12、的辅助空间,用来作为记录交换的中间暂存单元;中间暂存单元;冒泡排序是一种稳定的排序方法冒泡排序是一种稳定的排序方法。v冒泡排序时间复杂度的分析冒泡排序时间复杂度的分析:当最好的情况时,也:当最好的情况时,也就是要排序的表本身就是有序的,时间复杂度为就是要排序的表本身就是有序的,时间复杂度为O(n)。当最坏的情况时,即待排序表是逆序的情况,。当最坏的情况时,即待排序表是逆序的情况,此时需要比较此时需要比较次,并作次,并作等数量级的记录移动。因此,总的时间复杂度为等数量级的记录移动。因此,总的时间复杂度为O(n2)。8.3.2快速排序快速排序(划分交换排序)(划分交换排序)基本思想:在当前无序区基
13、本思想:在当前无序区R1k任取一个记录作为比较任取一个记录作为比较的的“基准基准”,用此基准将当前无序区划分为左右两个较,用此基准将当前无序区划分为左右两个较小的无序子区:小的无序子区:R1i-1和和Ri+1k,而基准在而基准在Ri。要要求左边的无序子区中记录的关键字均小于或等于基准,求左边的无序子区中记录的关键字均小于或等于基准,右边的无序子区中记录的关键字均大于或等于基准的关右边的无序子区中记录的关键字均大于或等于基准的关键字。键字。8.3.2快速排序快速排序(划分交换排序)(划分交换排序)排序过程:设待排序列为排序过程:设待排序列为:Rs,Rs+1,Rt,附设附设两个指针两个指针low和
14、和high,设设基准(基准(枢轴)记录枢轴)记录tp=任意序列任意序列元素元素初始时令low=s,high=t首先从high所指位置向前搜索第一个关键字小于tp.key的记录,并和tp交换例例初始关键字:初始关键字:4938659776132750基准基准tplowhigh27hightp.ktp.klow974次交换后:次交换后:27381376976550lowhighhigh()tp=4949再分别对两个子序列进行快速排序,直到每个子序列只含有一个记录为止再分别对两个子序列进行快速排序,直到每个子序列只含有一个记录为止完成一趟排序:完成一趟排序:(273813)49(76976550)分
15、别进行快速排序:分别进行快速排序:(13)27(38)49(5065)76(97)快速排序结束:快速排序结束:1327384950657697算法描述算法描述intPartition(SqList*L,intlow,inthigh)intpivotkey;pivotkey=L-rlow;while(lowhigh)while(lowrhigh=pivotkey)high-;swap(L,low,high);while(lowrlow=pivotkey)low+;swap(L,low,high);returnlow;快速排序算法分析快速排序算法分析 p稳定性:不定性:不稳定排序。定排序。p时间复
16、复杂度:度:一一般般情情况况(每每次次等等分分子子表表):):O(nlog(nlog2 2n)n)最坏情况(初始序列有序):最坏情况(初始序列有序):O(n(n2 2)p空空间性能:性能:1个个辅助空助空间。8.4选择排序选择排序v基本思想:每一趟在n-i+1(i=1,2,n)个记录中选取关键字最小的记录作有序序列中的第i个记录v直接选择排序首先通过首先通过n-1次关键字比较,从无序区次关键字比较,从无序区R1n中找中找出关键字最小的记录,将它与第一个记录交换出关键字最小的记录,将它与第一个记录交换再通过再通过n-2次比较,从无序区次比较,从无序区R2n中找出关键字中找出关键字次小的记录,将它
17、与第二个记录交换次小的记录,将它与第二个记录交换重复上述操作,共进行重复上述操作,共进行n-1趟排序后,最终序列变趟排序后,最终序列变成有序序列,排序结束。成有序序列,排序结束。例例初始:初始:49386597761327kjjjjjji=11349一趟:一趟:13386597764927i=2kkjjjjj2738二趟:二趟:13276597764938三趟:三趟:13273897764965四趟:四趟:13273849769765五趟:五趟:13273849659776六趟:六趟:13273849657697排序结束:排序结束:13273849657697k:记录当前最小记录的位置记录当前
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 排序 要点
限制150内