第8章-排序要点优秀PPT.ppt
《第8章-排序要点优秀PPT.ppt》由会员分享,可在线阅读,更多相关《第8章-排序要点优秀PPT.ppt(69页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第八章第八章 排序排序DS应用实践应用实践插入排序插入排序 基数排序基数排序归并排序归并排序交换排序交换排序选择排序选择排序Hot Tip 本章学习的要点主要是了解各种排序方法实现时所依据的原则以及它们的主要操作(关键字间的比较和记录的移动)的时间分析。学习中应留意驾驭各种排序方法实现的要点,切实驾驭各种排序过程的排序特点所在。8.1基本概念基本概念v排序排序(Sorting)定义:是将一个数据元素(或记录)的定义:是将一个数据元素(或记录)的随意序列,重新排列成一个按关键字有序的序列。随意序列,重新排列成一个按关键字有序的序列。v关键字:数据元素中的某个数据项。关键字:数据元素中的某个数据项
2、。v 内部排序内部排序:待排序的记录存放在计算机随机存储器中进:待排序的记录存放在计算机随机存储器中进行的排序过程。行的排序过程。外部排序外部排序:待排序记录的数量很大,以致内存一次不能:待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中尚需对外存进行访问的排容纳全部记录,在排序过程中尚需对外存进行访问的排序过程。序过程。493865977613274913273849496576971327384949657697方法一:方法一:方法二:方法二:原始序列:原始序列:假设假设Ki=Kj(ij),且在排序前的序列中,且在排序前的序列中Ri领先于领先于Rj(即即i8?8?8?5791
3、01314845213905514131098Ri这方法简洁易懂,但效率不高,比如将下一元素这方法简洁易懂,但效率不高,比如将下一元素45插入到当前的有插入到当前的有序表。假如将当前待插入的元素序表。假如将当前待插入的元素Ri与有序区中的元素从后往前进与有序区中的元素从后往前进行比较,若行比较,若RiRi-1则停止比较,则停止比较,Ri呆在原位不动即可呆在原位不动即可;若若RiRi-1则接着往前进行比较,且进行比较的同时将被比较过的则接着往前进行比较,且进行比较的同时将被比较过的元素后移一位置,直到元素后移一位置,直到Ri大于其中某一元素大于其中某一元素Rk为止,为止,Ri则插入则插入到到Rk
4、+1的位置上。的位置上。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)2
5、7i=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具体步骤具体步骤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;/有数据交换,循环接着有数据交换,循环接着算法评价算法评价时间困难度时间困难度最好状况(正序)最好状况(正序)比较次数:比较次数:n-1移动次数:移动次数:012345最坏状况(逆序)最坏状况(逆序)比较次数:比较次数:Y移动次数:移动次数:空间困难度:空间困难度:S(n)=O(1)T(n)=O(n)54321v冒泡排序比较简洁,当时始序列基本有序时,冒泡冒泡排序比较简洁,当时始序列基本有序时,冒泡排序有较高的效率,反之效率较低;其次冒泡排序排序有较高的效率,反之效率较低;其次冒泡排序只须要一个记录的协助空间,用来作为记录交换的只须要一个记
12、录的协助空间,用来作为记录交换的中间暂存单元;冒泡排序是一种稳定的排序方法。中间暂存单元;冒泡排序是一种稳定的排序方法。v冒泡排序时间困难度的分析:当最好的状况时,也冒泡排序时间困难度的分析:当最好的状况时,也就是要排序的表本身就是有序的,时间困难度为就是要排序的表本身就是有序的,时间困难度为O(n)。当最坏的状况时,即待排序表是逆序的状况,。当最坏的状况时,即待排序表是逆序的状况,此时须要比较此时须要比较次,并作次,并作等数量级的记录移动。因此,总的时间困难度为等数量级的记录移动。因此,总的时间困难度为O(n2)。快速排序快速排序(划分交换排序)(划分交换排序)基本思想:在当前无序区基本思想
13、:在当前无序区R1k任取一个记录作为比较任取一个记录作为比较的的“基准基准”,用此基准将当前无序区划分为左右两个较,用此基准将当前无序区划分为左右两个较小的无序子区:小的无序子区:R1i-1和和Ri+1k,而基准在,而基准在Ri。要。要求左边的无序子区中记录的关键字均小于或等于基准,求左边的无序子区中记录的关键字均小于或等于基准,右边的无序子区中记录的关键字均大于或等于基准的关右边的无序子区中记录的关键字均大于或等于基准的关键字。键字。8.3.2快速排序(划分交换排序)快速排序(划分交换排序)排排序序过过程程:设设待待排排序序列列为为:Rs,Rs+1,Rt,附附设设两两个个指针指针low和和h
14、igh,设基准(枢轴)记录,设基准(枢轴)记录tp=随意序列元素随意序列元素初始时令初始时令low=s,high=t首首先先从从high所所指指位位置置向向前前搜搜寻寻第第一一个个关关键键字字小小于于tp.key的的记录,并和记录,并和tp交换交换例例初始关键字:初始关键字:4938659776132750基准基准tplowhigh27hightp.ktp.klow974次交换后:次交换后:27381376976550lowhighhigh()tp=4949再分别对两个子序列进行快速排序,直到每个子序列只含有一个记录为止再分别对两个子序列进行快速排序,直到每个子序列只含有一个记录为止完成一趟排
15、序:完成一趟排序:(273813)49(76976550)分别进行快速排序:分别进行快速排序:(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;快速排序算法分析快速
16、排序算法分析 p稳定性:不定性:不稳定排序。定排序。p时间困困难度:度:p一般状况一般状况(每次等分子表每次等分子表):O(nlog2n)p最坏状况(初始序列有序):最坏状况(初始序列有序):O(n2)p空空间性能:性能:1个个协助空助空间。8.4选择排序选择排序v基本思想:每一趟在n-i+1(i=1,2,n)个记录中选取关键字最小的记录作有序序列中的第i个记录v干脆选择排序v首先通过n-1次关键字比较,从无序区R1n 中找出关键字最小的记录,将它与第一个记录交换v再通过n-2次比较,从无序区R2n中找出关键字次小的记录,将它与其次个记录交换v重复上述操作,共进行n-1趟排序后,最终序列变成有
17、序序列,排序结束。例例初始:初始:49386597761327kjjjjjji=11349一趟:一趟:13386597764927i=2kkjjjjj2738二趟:二趟:13276597764938三趟:三趟:13273897764965四趟:四趟:13273849769765五趟:五趟:13273849659776六趟:六趟:13273849657697排序结束:排序结束:13273849657697k:记录当前最小记录的位置:记录当前最小记录的位置kkvoidSelectSort(SqList*L)inti,j,min;for(i=1;ilength;i+)min=i;for(j=i+1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 排序 要点 优秀 PPT
限制150内