第9章排序案例.ppt
《第9章排序案例.ppt》由会员分享,可在线阅读,更多相关《第9章排序案例.ppt(74页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1第第9 9章章 排序排序9.1 9.1 插入排序插入排序9.2 9.2 交换排序交换排序9.3 9.3 选择排序选择排序9.4 9.4 归并排序归并排序9.5 9.5 基数排序基数排序9.6 9.6 各种内部排序方法的比较讨论各种内部排序方法的比较讨论29.1 9.1 插入排序插入排序一、直接插入排序一、直接插入排序二、折半插入排序二、折半插入排序三、希尔排序三、希尔排序3一、直接插入排序一、直接插入排序 l直接插入排序的基本操作是将一个记录直接插入排序的基本操作是将一个记录插入到已排好的有序表中,从而得到一插入到已排好的有序表中,从而得到一个新的、记录数增加个新的、记录数增加1 1的有序表
2、。的有序表。l例如:已知待排序的一组记录的初始排例如:已知待排序的一组记录的初始排列如下所示:列如下所示:R(49),),R(38),),R(65),),R(97),),R(76),),R(13),),R(27),),R(19)。)。4l假设在排序过程中,前四个记录已按关键字递增的次序,重假设在排序过程中,前四个记录已按关键字递增的次序,重新排列,构成一个含新排列,构成一个含4个记录的有序序列个记录的有序序列:l现要将第现要将第5个(关键字为个(关键字为76)的记录插入上述序列,可以得到)的记录插入上述序列,可以得到一个新的含一个新的含5个记录的有序序列,个记录的有序序列,则首先要找到插入的位
3、置,则首先要找到插入的位置,然后进行插入。然后进行插入。l假设从假设从R(97)起向左进行顺序查找,由于)起向左进行顺序查找,由于65 76 97,则,则R(76)应插入在)应插入在R(65)和)和R(97)之间,从而得到下列新)之间,从而得到下列新的有序序列的有序序列:lR(38),),R(49),),R(65),),R(76),),R(97)(2)l称从式(称从式(1)到式()到式(2)的过程为一趟直接插入排序。)的过程为一趟直接插入排序。l38,49,65,97 (1)5l一般情况下,第一般情况下,第i i趟直接插入排序的操作为:趟直接插入排序的操作为:l在含有在含有i-1i-1个记录的
4、有序子序列个记录的有序子序列r1r1i-1i-1中插入一个记中插入一个记录录riri后,变成含有后,变成含有i i个记录的有序子序列个记录的有序子序列r1r1ii;l并且,和顺序查找类似,为了在查找插入位置的过并且,和顺序查找类似,为了在查找插入位置的过程中避免数组下标出界,在程中避免数组下标出界,在r0r0处设置监视哨。处设置监视哨。l整个排序过程为进行整个排序过程为进行n-1n-1趟插入,即:先将序列中的第趟插入,即:先将序列中的第一个记录看成是一个有序序列的子序,然后从第一个记录看成是一个有序序列的子序,然后从第2 2个记个记录起逐个进行插入直至整个序列变成按关键字非递减有录起逐个进行插
5、入直至整个序列变成按关键字非递减有序序列为止。序序列为止。l在自在自i-1i-1起往前搜索的过程中,可以同时后移记录。起往前搜索的过程中,可以同时后移记录。6例例49 38 65 97 76 13 27i=2 38 (38 49)65 97 76 13 27i=3 65 (38 49 65)97 76 13 27i=4 97 (38 49 65 97)76 13 27i=5 76 (38 49 65 76 97)13 27i=6 13 (13 38 49 65 76 97)27i=1 ()i=7 (13 38 49 65 76 97)2727jjjjjj977665493827 排序结果:排序
6、结果:(13 27 38 49 65 76 (13 27 38 49 65 76 97)97)7l记录按关键字非递增有序排列时比较的次记录按关键字非递增有序排列时比较的次数达最大值数达最大值记录移动次数达到最大值记录移动次数达到最大值l关键字间的比较次数和移动记录的次数关键字间的比较次数和移动记录的次数,约为约为n n2 2/4/4。由此,直接插入排序的时间。由此,直接插入排序的时间复杂度为复杂度为OO(n n2 2 )。)。l记录按关键字非递减有序排列时比较的记录按关键字非递减有序排列时比较的次数达最小值次数达最小值:记录不需要移动。记录不需要移动。8二、折半插入排序二、折半插入排序l插入排
7、序的基本操作是在一个有序表中插入排序的基本操作是在一个有序表中进行查找和插入,则从上章的讨论可知,进行查找和插入,则从上章的讨论可知,这个这个“查找查找”操作可利用操作可利用“折半查找折半查找”来来实现,实现,由此进行的插入排序称之为折半插由此进行的插入排序称之为折半插入排序入排序。9i=1 (30)13 70 85 39 42 6 20i=2 13 (13 30)70 85 39 42 6 20.i=8 20 (6 13 20 30 39 42 70 85)折半插入排序折半插入排序i=8 20 (6 13 30 39 42 70 85)20lowhighmidi=8 20 (6 13 30
8、39 42 70 85)20lowhighmidi=8 20 (6 13 30 39 42 70 85)20low highmidi=8 20 (6 13 30 39 42 70 85)20lowhigh10三、希尔排序三、希尔排序l基本思想基本思想:先将整个待排记录序列分割成:先将整个待排记录序列分割成若干子序列分别进行直接插入排序,待整若干子序列分别进行直接插入排序,待整个序列中的记录个序列中的记录“基本有序基本有序”时,再对全时,再对全体记录进行一次直接插入排序。体记录进行一次直接插入排序。l排序过程:排序过程:先取一个正整数先取一个正整数d d1 1nn,把全部,把全部记录分成若干个组
9、,所有距离为记录分成若干个组,所有距离为d d1 1倍数的倍数的记录放一组,在各组内进行插入排序记录放一组,在各组内进行插入排序;然后然后取取d d2 2dd1 1,重复上述分组和排序工作,重复上述分组和排序工作;直至直至d di i=1=1,即所有记录放进一个组中排序为止,即所有记录放进一个组中排序为止11例:例:49 38 65 97 76 13 27 48 55 4一趟排序:一趟排序:13 27 48 55 4 49 38 65 97 76取取d d1 1=5=5一趟分组一趟分组:49 38 65 97 76 13 27 48 55 449 38 65 97 76 13 27 48 55
10、 4ji49133827jiji6548ji9755ji76412二趟排序:二趟排序:13 4 48 38 27 49 55 65 97 76取取d2=3二趟分组:二趟分组:13 27 48 55 4 49 38 65 97 7613 27 48 55 4 49 38 65 97 76jiji274jiji5538jijiji13取取d3=1三趟分组:三趟分组:13 4 48 38 27 49 55 65 97 76三趟排序:三趟排序:4 13 27 38 48 49 55 65 76 97l希尔排序所需的比较和移动次数约为希尔排序所需的比较和移动次数约为n n1.31.3,当,当n n 时,
11、可减少到时,可减少到n(logn(log2 2n)n)2 2。149.2 9.2 交换排序交换排序一、起泡排序一、起泡排序二、快速排序二、快速排序15一、起泡排序一、起泡排序p首先将最后一个记录的关键字与倒数第二首先将最后一个记录的关键字与倒数第二个记录的关键字进行比较,若为逆序个记录的关键字进行比较,若为逆序rn.keyrn-1.keyrn.keyrn-1.key,则将两个记录交换;,则将两个记录交换;然后依次类推,直至第然后依次类推,直至第2 2个记录和第个记录和第1 1个记个记录的关键字比较为止。录的关键字比较为止。上述过程称作第一上述过程称作第一趟冒泡排序趟冒泡排序,其结果使得关键字最
12、小的记,其结果使得关键字最小的记录录“漂浮漂浮”到第一个记录的位置上。到第一个记录的位置上。16o然后进行第二趟冒泡排序,对后然后进行第二趟冒泡排序,对后n-1n-1个记录进行同样操作,其结果是使关个记录进行同样操作,其结果是使关键字次小的记录键字次小的记录“漂浮漂浮”到第到第2 2个记个记录的位置上。录的位置上。o,重复上述过程,直到,重复上述过程,直到“在一趟在一趟排序过程中没有进行过交换记录的操排序过程中没有进行过交换记录的操作作”为止。为止。17例例49 38 65 97 76 13 27 30初初始始关关键键字字38 49 65 76 13 27 30 97第第一一趟趟38 49 6
13、5 13 27 30 76第第二二趟趟38 49 13 27 30 65第第三三趟趟38 13 27 30 49第第四四趟趟13 27 30 38第第五五趟趟13 27 30第第六六趟趟38497697139727971376767627301365276530651313494930492738273830383018算法描述与分析算法描述与分析l起泡排序的效率,若初始序列为起泡排序的效率,若初始序列为“正序正序”,则只需进行一趟排序,在排,则只需进行一趟排序,在排序过程中进行序过程中进行n-1n-1次关键字间的比较;次关键字间的比较;反之,若初序列反之,若初序列“逆序逆序”,则需进行,则需
14、进行n-1n-1趟排序,需进行趟排序,需进行 次比较。并作等数量级的记录移动,次比较。并作等数量级的记录移动,因此,总的时间复杂度为因此,总的时间复杂度为O O(n n2 2)。)。19二、快速排序二、快速排序 l其基本思想是其基本思想是:通过一趟排序将待:通过一趟排序将待排序记录分割成独立的两部分,其排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这分记录的关键字小,则可分别对这两部分记录进行排序,以达到整个两部分记录进行排序,以达到整个序列有序。序列有序。20l由此,可以该由此,可以该“枢轴枢轴”记录最后所落的位置最作分
15、界线,将记录最后所落的位置最作分界线,将序列序列L.rs,L.rs+1,L.rt分割成两个子序列分割成两个子序列L.rs,L.rs+1,L.ri-1和和 L.ri+1,L.ri+2,L.rt,这个过程称作一趟快速排序这个过程称作一趟快速排序。l一趟快速排序的具体做法是一趟快速排序的具体做法是:对:对rst中记录进行一趟快速中记录进行一趟快速排序,附设两个指针排序,附设两个指针low和和high,它们的初值分别为,它们的初值分别为low和和high,设枢轴记录的关键字为,设枢轴记录的关键字为Pivotkey,l然后从然后从low所指位置起向后搜索找到第一个关键字大于所指位置起向后搜索找到第一个关
16、键字大于Pivotkey的记录和枢轴记录相互交换做,重复这两步直至的记录和枢轴记录相互交换做,重复这两步直至low=high。l首先从首先从high所指位置起向前搜索找到第一个关键字小于所指位置起向前搜索找到第一个关键字小于Pivotkey的记录和枢轴记录相互交换,的记录和枢轴记录相互交换,21X 初始关键字:初始关键字:49 38 65 97 76 13 27 50lowhigh4927lowhighlowhighlowhigh6549lowhigh4913lowhigh9749lowhighlowhigh 完成一趟排序:完成一趟排序:(27 38 13)49(76 97 65 50)22分
17、别进行快速排序分别进行快速排序(13)27(38)49(50 65)76(97)快速排序结束:快速排序结束:13 27 38 49 50 65 7623l通常,快速排序平均时间复杂度为通常,快速排序平均时间复杂度为O(nlogn),但待排序记录的,但待排序记录的键值几乎已排序时,情况反而恶化,每一趟快速排序的基准记键值几乎已排序时,情况反而恶化,每一趟快速排序的基准记录位置就是第一个记录位置或最后一个记录位置。最坏情况下录位置就是第一个记录位置或最后一个记录位置。最坏情况下的时间复杂度为的时间复杂度为T(n)=O(n)。l快速排序的平均时间为快速排序的平均时间为Tavg(n)=knlnn,其中
18、,其中n为待排序序列记为待排序序列记录的个数,录的个数,k为某个常数,经验证明,在所有同数量级的此类为某个常数,经验证明,在所有同数量级的此类(先进的)排序方法中,快速排序的常数因子(先进的)排序方法中,快速排序的常数因子k最小。因此,最小。因此,就就平均时间而言,快速排序是目前被认为是最好的一种内部排序平均时间而言,快速排序是目前被认为是最好的一种内部排序方法。方法。l快速排序递归算法需要栈空间来实现递归,一般情况下需要的空快速排序递归算法需要栈空间来实现递归,一般情况下需要的空间为间为S(n)=O(log2n),最坏情况下,需要的栈空间为,最坏情况下,需要的栈空间为S(n)=O(n)。l快
19、速排序方法是不稳定的快速排序方法是不稳定的。249.3 9.3 选择排序选择排序一、简单选择排序一、简单选择排序二、树形选择排序二、树形选择排序三、堆排序三、堆排序25一、简单选择排序一、简单选择排序l一趟简单选择排序的操作为:通过一趟简单选择排序的操作为:通过n-1n-1次次关键字的比较,从关键字的比较,从n n个记录中选择出关键个记录中选择出关键字最小的记录,并和第字最小的记录,并和第1 1个记录交换。个记录交换。l再通过再通过n-2n-2次比较,从剩余的次比较,从剩余的n-1n-1个记个记录中找出关键字次小的记录,将它与第录中找出关键字次小的记录,将它与第2 2个记录交换个记录交换l重复
20、上述操作,共进行重复上述操作,共进行n-1n-1趟排序后,趟排序后,排序结束排序结束.26初始:初始:49 38 65 97 76 13 27 jkkkkkkjji=11349一趟一趟:13 38 65 97 76 49 27 i=2jjkkkkk2738二趟二趟:13 27 65 97 76 49 38 三趟三趟:13 27 38 97 76 49 65 27五趟五趟:13 27 38 49 6513 27 38 49 65 97 76 97 76 六趟六趟:13 27 38 49 65 7613 27 38 49 65 76 97 97 排序结束排序结束:13 27 38 49 65 76
21、 9713 27 38 49 65 76 97四趟四趟:13 27 38 49 76 97 65 28o简单选择排序过程中,所需进行记录移简单选择排序过程中,所需进行记录移动的操作次数较少,其最小值为动的操作次数较少,其最小值为0 0,最大,最大值为值为3(n-1)3(n-1)。然而,无论记录的初始排列。然而,无论记录的初始排列如何,所需进行的关键字间的比较次数如何,所需进行的关键字间的比较次数相同,均为相同,均为(n(n-1)/2(n(n-1)/2。因此,总的时间。因此,总的时间复杂度也是复杂度也是 O O(n n2 2)。)。算法描述与算法评价算法描述与算法评价29二、树形选择排序二、树形
22、选择排序l树形选择排序,又称锦标赛排序树形选择排序,又称锦标赛排序,是一种,是一种按照锦标赛的思想进行选择排序的方法按照锦标赛的思想进行选择排序的方法l首先对首先对n n个记录的关键字进行两两比较,个记录的关键字进行两两比较,然后在其中然后在其中 n/2n/2 个较小者之间再进行个较小者之间再进行两两比较,如此重复,直至选出最小关两两比较,如此重复,直至选出最小关键字的记录为止。键字的记录为止。30386549977613274938651327381313树形选择排序示例树形选择排序示例31树形选择排序示例树形选择排序示例3865499776 274938657627382727输出输出13
23、13之后之后32树形选择排序示例树形选择排序示例3865499776 4938657649384938输出输出1313、2727之后之后33或或(i=1,2,.n/2)ki k2iki k2i+1ki k2iki k2i+1三、堆排序三、堆排序2 2、堆和完全二叉树、堆和完全二叉树 堆顶元素(或完全二叉树的根)必为序堆顶元素(或完全二叉树的根)必为序列中列中n n个元素的最小值(或最大值)个元素的最小值(或最大值)1、堆的定义、堆的定义 n n个元素的序列个元素的序列(k(k1 1,k,k2 2,k kn n),当且仅,当且仅当满足下列关系时,称之为堆当满足下列关系时,称之为堆34例例 (13
24、,38,27,50,76,65,49,97)1327384965765097353 3、堆排序、堆排序:若在输出堆顶的最小值之:若在输出堆顶的最小值之后,使得剩余后,使得剩余n-1n-1个元素的序列重又个元素的序列重又建成一个堆,则可得到建成一个堆,则可得到n n个元素的次个元素的次小值;如此反复执行,便能得到一个小值;如此反复执行,便能得到一个有序序列,这个过程称之为有序序列,这个过程称之为堆排序堆排序。l实现堆排序需解决的两个问题实现堆排序需解决的两个问题l如何由一个无序序列建成一个堆?如何由一个无序序列建成一个堆?l如何在输出堆顶元素之后,调整剩余如何在输出堆顶元素之后,调整剩余元素,使
25、之成为一个新的堆?元素,使之成为一个新的堆?l二个问题解决方法二个问题解决方法筛选筛选364 4、筛选、筛选 13273849657650979727384965765013输出:输出:13372749389765765013输出:输出:139749382765765013输出:输出:13 27383849502765769713输出:输出:13 276549502738769713输出:输出:13 27 38394965502738769713输出:输出:13 27 387665502738499713输出:输出:13 27 38 49405065762738499713输出:输出:13 2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 排序 案例
限制150内