数据结构及算法-排序.ppt
《数据结构及算法-排序.ppt》由会员分享,可在线阅读,更多相关《数据结构及算法-排序.ppt(116页珍藏版)》请在三一办公上搜索。
1、第八章 排序技术,本章的基本内容是:排序的基本概念插入排序交换排序选择排序归并排序,8.1概 述,排序:将一组“无序”的记录序列,调整为按关键字“有序”的记录序列.,1.排序的基本概念,排序:给定一组记录的集合r1,r2,rn,其相应的关键码分别为k1,k2,kn,排序是将这些记录排列成顺序为rs1,rs2,rsn的一个序列,使得相应的关键码满足非递减关系ks1ks2ksn(称为升序)或非递增关系ks1ks2ksn(称为降序)。,1.排序的基本概念,8.1概 述,假定在待排序的记录集中,存在多个具有相同键值的记录,若经过排序,这些记录的相对次序仍然保持不变,即在原序列中,ki=kj且ri在rj
2、之前,而在排序后的序列中,ri一定在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。,排序算法的稳定性:,8.1概 述,1.排序的基本概念,待排序序列中的记录已按关键码排好序。待排序序列中记录的排列顺序与排好序的顺序正好相反。,8.1概 述,1.排序的基本概念,正序:,逆序(反序):,排序的分类 在排序的整个过程中,待排序的所有记录全部被放置在内存中,不需要访问外存 由于待排序的记录个数太多,不能同时放置在内存,而需要将一部分记录放置在内存,另一部分记录放置在外存上,整个排序过程需要在内外存之间多次交换数据才能得到排序的结果。,8.1概 述,1.排序的基本概念,1.内排序:,2.外排序:
3、,2.内排序算法,1.插入排序 2.交换排序 3.选择排序 4.归并排序,8.1概 述,排序基本过程:是一个逐步扩大记录的有序序列长度的过程,3.排序的基本过程,有序序列区,无序序列区,有序序列区,无序序列区,一趟排序,一趟排序:将无序序列区里一个或几个记录合并到有序序列的过程为一趟排序,有序序列长度增加1个或几个,8.1概 述,4.排序算法的存储结构,从操作角度看,排序是线性结构的一种操作,待排序记录可以用顺序存储结构或链接存储结构存储。,假定2:将待排序的记录序列排序为升序序列。,rn+1,假定1:待排序记录采用顺序存储结构,关键码为整型,且记录只有关键码一个数据项。,8.1概 述,内排序
4、算法,1.插入排序 2.交换排序 3.选择排序 4.归并排序,8.1概 述,8.2插入排序,插入排序的主要操作是插入,其基本思想是:每次将一个待排序的记录按其关键码的大小插入到一个已经排好序的有序序列中,直到全部记录排好序为止。,举例:有序序列 2,待排序记录 3,6,1,1)直接插入排序2)希尔排序,基本思想:在插入第 i(i1)个记录时,前面的 i-1个记录已经排好序。,直接插入排序,8.2插入排序,直接插入排序过程示例,r 0 1 2 3 4 5 6,21,18,25,22,10,25*,21,21,18,10,第五趟,算法稳定吗?,21,算法思想?,i从第2个数到第n个数 将第i个数插
5、入到有序序列中的合理位置,8.2插入排序,共多少趟?,对于ri,如何查找它的插入位置?如何实现插入?,直接插入排序,需解决的关键问题?,20,25,21,18,26,1)将ri暂存在r02)j=i-1;/从第i-1记录开始查找3)当rjr0时,循环做 rj后移一个位置,j-4)rj+1=r0/将r0插入到位置j+1,22,0 1 2 3 4 5,21,i,j,25,j,22,j,21,8.2插入排序,直接插入排序,20,25,10,18,25,22,0 1 2 3 4 5,10,i,j,25,22,20,10,j,r0的作用?,暂存单元,监视哨,对于ri,如何查找它的插入位置?如何实现插入?,
6、需解决的关键问题?,1)将ri暂存在r02)j=i-1;/从第i-1记录开始查找3)当rjr0时,循环做 rj后移一个位置,j-4)rj+1=r0/将r0插入到位置j+1,j,j,8.2插入排序,void insertSort(int r,int n)for(i=2;i=n;i+)r0=ri;for(j=i-1;r0rj;j-)rj+1=rj;rj+1=r0;,直接插入排序算法,1.i从第2个到第n个记录,做以下循环:1.1将ri暂存在r0 1.2 j=i-1;1.3当rjr0时,循环做:rj后移一个位置,j-1.4 rj+1=r0,8.2插入排序,直接插入排序过程示例,r 0 1 2 3 4
7、 5 6,21,18,25,22,10,25*,21,22,10,25,21,18,25,21,8.2插入排序,直接插入排序练习,12 5 9 20 6 31 24,8.2插入排序,直接插入排序练习,12 5 9 20 6 31 24,初始序列,5 12 9 20 6 31 24,第一趟,5 9 12 20 6 31 24,第二趟,5 9 12 20 6 31 24,第三趟,5 6 9 12 20 31 24,第四趟,第五趟,5 6 9 12 20 31 24,第六趟,5 6 9 12 20 24 31,8.2插入排序,1.基本操作。内排序在排序过程中的基本操作:比较:关键码之间的比较;移动:
8、记录从一个位置移动到另一个位置。2.辅助存储空间。辅助存储空间是指在数据规模一定的条件下,除了存放待排序记录占用的存储空间之外,执行算法所需要的其他存储空间。3.算法本身的复杂程度。,排序算法的性能,8.2插入排序,直接插入排序算法性能分析,最好情况下:,时间复杂度为O(n)。,(正序),8.2插入排序,直接插入排序算法性能分析,最好情况下(正序):,最坏情况下(逆序):,时间复杂度为O(n2)。,时间复杂度为O(n)。,8.2插入排序,平均情况下(随机排列):,直接插入排序算法性能分析,时间复杂度为O(n2)。,8.2插入排序,空间性能:需要一个记录的辅助空间。直接插入排序算法是一种稳定的排
9、序算法。,直接插入排序算法性能分析,直接插入排序算法简单、容易实现,适用于待排序记录基本有序或待排序记录较小时。当待排序的记录个数较多时,大量的比较和移动操作使直接插入排序算法的效率降低。,8.2插入排序,希尔排序,改进的着眼点:(1)由于直接插入排序算法简单,在待排序记录数量n较小时效率也很高。(2)若待排序记录按关键码基本有序时,直接插入排序的效率可以大大提高;,3,2,1,8.2插入排序,(1)应如何分割待排序记录,才能保证整个序列逐步向基本有序发展?(2)子序列内如何进行直接插入排序?,需解决的关键问题?,基本思想:将整个待排序记录分割成若干个子序列,在子序列内分别进行直接插入排序,待
10、整个序列中的记录基本有序时,对全体记录进行直接插入排序。,希尔排序,20 18 19,6 5 7,1 3 2,20 18 19 6 5 7 1 3 2,8.2插入排序,希尔排序,子序列的构成不能是简单地“逐段分割”,而是将相距某个“增量”的记录组成一个子序列。逐渐缩短“增量”,当缩短为1时就是对全体记录进行排序。,d=3,基本思想:将整个待排序记录分割成若干个子序列,在子序列内分别进行直接插入排序,待整个序列中的记录基本有序时,对全体记录进行直接插入排序。,8.2插入排序,希尔插入排序过程示例,1 2 3 4 5 6 7 8 9,40,21,25,49,25*,16,初始序列,30,08,13
11、,d=4,每隔d-1个增量记录分为一组每组内采用直接插入排序,8.2插入排序,算法稳定吗?,解决方法:将相隔某个“增量”的记录组成一个子序列。增量应如何取?希尔最早提出的方法是d1=n/2,di+1=di/2。,关键问题(1)应如何分割待排序记录?,算法描述:for(d=n/2;d=1;d=d/2)以d为增量,进行组内直接插入排序;,8.2插入排序,希尔插入排序过程示例,1 2 3 4 5 6 7 8 9,40,21,25,49,25*,16,初始序列,30,08,13,d=4,每隔d分为一组,在整个序列中,前d个记录分别是d个子序列中的第一个记录,所以从第d+1个记录开始进行插入。,for(
12、i=d+1;i=n;i+),8.2插入排序,希尔插入排序过程示例,1 2 3 4 5 6 7 8 9,40,21,25,49,25*,16,初始序列,30,08,13,d=4,每隔d分为一组,将插入数据ri暂存入r0j=i-1当rjr0,循环做:rj后移一位j-r0插入到位置j+1,将插入数据ri暂存入r0j=i-d当rjr0且j0,循环做:ri后移d位 j=j-d;r0插入到位置j+d,直接插入排序:,希尔排序:,8.2插入排序,解决方法:在插入记录ri时,自ri-d起往前跳跃式(跳跃幅度为d)搜索待插入位置,并且r0只是暂存单元,不是哨兵。当搜索位置0,表示插入位置已找到。在搜索过程中,记
13、录后移也是跳跃d个位置。在整个序列中,前d个记录分别是d个子序列中的第一个记录,所以从第d+1个记录开始进行插入。,关键问题(2)子序列内如何进行直接插入排序?,8.2插入排序,算法描述:,for(i=d+1;i0,关键问题(2)子序列内如何进行直接插入排序?,8.2插入排序,void ShellSort(int r,int n)for(d=n/2;d=1;d=d/2)/以d为增量,组内直接插入排序 for(i=d+1;i0,希尔插入排序,8.2插入排序,希尔排序练习,12 5 9 20 6 31 24,初始序列,第一趟结果d=3,第二趟结果d=2,第三趟结果d=1,12 5 9 20 6 3
14、1 24,6 5 9 20 12 31 24,5 6 9 12 20 24 31,初始化:d=3,d=2 d=1,8.2插入排序,希尔排序算法的时间性能,希尔排序算法的时间性能是所取增量的函数,而到目前为止尚未有人求得一种最好的增量序列。研究表明,希尔排序的时间性能在O(n2)和O(nlog2n)之间。当n在某个特定范围内,希尔排序所需的比较次数和记录的移动次数约为O(n1.3)。希尔排序不稳定,希尔排序开始时增量较大,每个子序列中的记录个数较少,从而排序速度较快;当增量较小时,虽然每个子序列中记录个数较多,但整个序列已基本有序,排序速度也较快。,8.2插入排序,第八章 排序技术,本章的基本内
15、容是:排序的基本概念插入排序交换排序选择排序归并排序,交换排序的主要操作是交换,其主要思想是:在待排序列中选两个记录,将它们的关键码相比较,如果反序(即排列顺序与排序后的次序正好相反),则交换它们的存储位置。,8.3交换排序,反序则 交换,1)冒泡排序2)快速排序,起泡排序,基本思想:两两比较相邻记录的关键码,如果反序则交换,直到没有反序的记录为止。,8.3交换排序,05,98,12,69,38,53,81,起泡排序过程示例,总共n-1趟,一共做多少趟?,for(i=1;irj+1)rjrj+1;,第i趟的比较范围:,从1到(n-i),8.3交换排序,1 2 3 4 5 6 7,05,98,1
16、2,69,38,53,81,起泡排序过程示例,提问:一定需要做n-1趟?,如果在一趟排序过程中没有进行过交换操作,则排序结束。,8.3交换排序,解决方法:在每一趟起泡排序之前,令exchange的初值为0。在排序过程中,只要有记录交换,用exchange记录交换发生的位置。这样,在一趟排序结束后,只有当exchange的值不为0才需要继续做下一趟冒泡排序。,关键问题1):如何判别起泡排序的结束?,int exchange=n;while(exchange)exchange=0;for(j=1;jrj+1)rjrj+1;exchange=j;,for(i=1;irj+1)rjrj+1;,8.3交
17、换排序,05,98,12,69,38,53,81,起泡排序过程示例,提问:每趟排序只能使待排序范围减1吗?,8.3交换排序,05,98,12,69,78,81,30,起泡排序过程示例,如果最后一次交换是(位置j)(位置j+1),位置j以后的所有记录均已经有序,即下一趟的待排序范围缩短为1到j,j,j+1,8.3交换排序,j,关键问题 2):如何确定每趟起泡排序的范围?,解决方法:变量exchange记载的是这趟排序中最后一次交换的位置,而下一趟的排序范围是1到exchange。,int exchange=n;while(exchange)bound=exchange;exchange=0;fo
18、r(j=1;jrj+1)rjrj+1;exchange=j;,int exchange=n;while(exchange)exchange=0;for(j=1;jrj+1)rjrj+1;exchange=j;,8.3交换排序,void BubbleSort(int r,int n)exchange=n;/初始的排序范围是所有记录 while(exchange)bound=exchange;exchange=0;for(j=1;jrj+1)rjrj+1;exchange=j;,起泡排序算法,8.3交换排序,起泡排序练习,12 5 9 20 6 31 24,初始序列,第一趟结果,第二趟结果,第三趟
19、结果,第四趟结果,5 9 12 6 20 24 31,5 9 6 12 20 24 31,5 6 9 12 20 24 31,5 6 9 12 20 24 31,8.3交换排序,起泡排序的时间性能分析,最好情况:,时间复杂度为O(n)。,8.3交换排序,(正序),最坏情况(反序):,起泡排序的时间性能分析,最好情况(正序):,时间复杂度为O(n);,时间复杂度为O(n2)。,平均情况:时间复杂度为O(n2)。,稳定算法,8.3交换排序,内排序算法,1.插入排序 2.交换排序 3.选择排序 4.归并排序,8.1概 述,快速排序,首先选一个轴值(即比较的基准),通过一趟排序将待排序记录分割成独立的
20、两部分,前一部分记录的关键码均小于或等于轴值,后一部分记录的关键码均大于或等于轴值,然后分别对这两部分重复上述方法,直到整个序列有序。,举例:38 27 55 50 33 30 49 65 30 27 33 38 50 55 49 6527 30 33 38 49 50 55 6527 30 33 38 49 50 55 65,8.3交换排序,算法思想:,快速排序的基本思想,如何选择轴值?如何实现分割(称一次划分)?如何处理分割得到的两个待排序子序列?如何判别快速排序的结束?,需解决的关键问题?,举例:38 27 55 50 33 30 49 65 30 27 33 38 50 55 49 6
21、5,8.3交换排序,选择轴值的方法:1.使用第一个记录的关键码;2.选取序列中间记录的关键码;3.比较序列中第一个记录、最后一个记录和中间记录的关键码,取关键码居中的作为轴值并调换到第一个记录的位置;4.随机选取轴值。,关键问题:如何选择轴值?,选取不同轴值的后果:决定两个子序列的长度,期望子序列的长度最好相等。,8.3交换排序,举例:38 27 55 50 33 30 49 65 30 27 33 38 50 55 49 65,27,50,38,49,55,关键问题:如何实现一次划分?,每个数和轴值做比较,比轴值大的数放后面,比轴值小的数放前面。关键在于数和轴值交换,从前、后两端开始,逐渐向
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法 排序
链接地址:https://www.31ppt.com/p-6166886.html