收藏 分享(赏)

第6章 排序.ppt

上传人:hskm5268 文档编号:8833742 上传时间:2019-07-14 格式:PPT 页数:50 大小:812KB
下载 相关 举报
第6章 排序.ppt_第1页
第1页 / 共50页
第6章 排序.ppt_第2页
第2页 / 共50页
第6章 排序.ppt_第3页
第3页 / 共50页
第6章 排序.ppt_第4页
第4页 / 共50页
第6章 排序.ppt_第5页
第5页 / 共50页
点击查看更多>>
资源描述

1、第6章 排序,内容提要: 五类内部排序方法(插入排序、交换排序、选择排序、归并排序和基数排序)的基本思想、排序过程、实现的算法、算法的效率分析及排序的特点; 各种排序方法的比较和选择; 最后简单介绍外部排序。,2,排序的功能是将一个数据元素(记录)的任意序列,重新排列成一个按关键字有序的序列。,排序的定义,3,排序的分类,按待排序记录所在位置 内部排序:待排序记录存放在内存 外部排序:排序过程中需对外存进行访问的排序 按排序依据原则 插入排序:直接插入排序、希尔排序 交换排序:冒泡排序、快速排序 选择排序:直接选择排序、堆排序 归并排序:2-路归并排序 基数排序:多关键字排序,4,排序,排序的

2、特性值相同的数据元素排序后如果仍保持原顺序中的相对位置,则称为“稳定性排序”,反之,则称为“不稳定性排序”。,Data,稳定性排序:Data,不稳定性排序:Data,5,排序的基本操作,比较两个关键字大小 将记录从一个位置移动到另一个位置,基本思想:每步将一个待排序的记录,按其关键字值的大小插入到前面已经排序的文件中适当的位置上,直到全部插完为止。,插入排序,基本思路是依次把待排序的记录逐一按其关键字的大小插入到一个已经排好序的有序序列中去,直到所有的记录插完为止。得到一个新的有序序列。,插入排序直接插入排序,8,例,49 38 65 97 76 13 27,i=2 38 (38 49) 65

3、 97 76 13 27,i=3 65 (38 49 65) 97 76 13 27,i=4 97 (38 49 65 97) 76 13 27,i=5 76 (38 49 65 76 97) 13 27,i=6 13 (13 38 49 65 76 97) 27,i=1 ( ),i=7 (13 38 49 65 76 97) 27,27,97,76,65,49,38,27,比较次数 移动次数,2 1,1 0,2 1.,1 0,6 5,6 5,插入排序直接插入排序,9,(1)设置监视哨 r0,将待插入记录的值赋给r0; (2)设置开始查找的位置j; (3)在数组中进行搜索,搜索中将第j个记录后

4、移,直至r0.keyrj.key为止 (4)将r0插入在rj+1的位置上,直接插入排序算法,10,直接插入排序算法分析,直接插入排序的时间复杂度为O(n2 )。 空间复杂度为O(1) 直接插入排序是一种稳定的排序方法。,11,插入排序希尔排序,希尔排序:选定第一个增量d1n,把全部记录按此值从第一个记录起进行分组,所有相距为d1的记录作为一组,先在各组内进行插入排序,然后减小间隔,取第二个增量d2d1,重复上述分组和排序过程,直至增量值di=1为止,即所有的记录放在同一组内排序。,12,13,1)外循环以各种不同的间隔距离d进行排序,直到d=1为止; 2)第二重循环是在某一个d值下对各组进行排

5、序, 若在某个d值下发生了记录的交换,则需继续第三重循环循环,直至各组内均无记录的交换为止。即各组内已完成排序任务; 3)第三重循环是从第一个记录开始,按某个d值为间距进行组内比较。若有逆序,则进行交换。,插入排序希尔排序算法,14,主要特点是每一趟以不同的增量进行插入排序。当d较大时,被移动的记录是跳跃式进行的。到最后一趟排序时(d=1),许多记录已经有序,不需要多少移动,所以能提高了排序的速度。 希尔排序是不稳定的排序方法。,希尔排序算法分析,15,交换排序,交换排序是通过两两比较待排序记录的关键值,交换不满足顺序的那些偶对,直到全部满足为止。,交换排序冒泡排序,将第一个记录的关键字与第二

6、个记录的关键字进行比较,若为逆序r1.keyr2.key,则交换;然后比较第二个记录与第三个记录;依次类推,直至第n-1个记录和第n个记录比较为止第一趟冒泡排序,结果关键字最大的记录被安置在最后一个记录上。 对前n-1个记录进行第二趟冒泡排序,结果使关键字次大的记录被安置在第n-1个记录位置。 重复上述过程,直到“在一趟排序过程中没有进行过交换记录的操作”为止。,17,例,38,49,76,97,13,97,27,97,30,97,13,76,76,76,27,30,13,65,27,65,30,65,13,13,49,49,30,49,27,38,27,38,30,38,交换排序冒泡排序,1

7、8,由上述算法可见,当初始序列中记录已按关键字次序排好序,则只需要进行一趟排序,在排序过程中只需要进行n-1次比较,记录移动次数为0;反之,若初始序列中记录按逆序排列,若待排序的序列有n个记录,最多进行n-1趟排序,最大比较次数为,故总的时间复杂度为O(n2 )。冒泡排序是稳定的。,冒泡排序算法分析,交换排序快速排序,基本思想:通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录进行排序,以达到整个序列有序,20,对rst中记录进行一趟快速排序,附设两个指针i和j,设枢轴记录rp=rs,x=rp.key初始时令i=s,j=t。首

8、先从j所指位置向前搜索第一个关键字小于x的记录,并和rp交换。再从i所指位置起向后搜索,找到第一个关键字大于x的记录,和rp交换。重复上述两步,直至i=j为止。再分别对两个子序列进行快速排序,直到每个子序列只含有一个记录为止。,快速排序的排序过程,21,完成一趟排序: ( 27 38 13) 49 (76 97 65 50),分别进行快速排序: ( 13) 27 (38) 49 (50 65) 76 (97),快速排序结束: 13 27 38 49 50 65 76 97,49,27,49,65,13,49,49,97,快速排序的排序过程,22,1)确定第一个记录为基准记录rt,先从j所指示的

9、位置起向前扫描,当rt.keyrj.key时,交换rt.key和rj.key,使关键字值比基准记录的关键字值小的记录交换到前面; 2)从i所指示的位置起向后扫描,直到rt.keyri.key, 交换rt.key和ri.key,使关键字值比基准记录的关键字值大的记录交换到后面; 3)重复(1)和(2),直至i=j为止完成一趟排序; 4)只要tw,重复(1)至(3)分别对基准记录两边的部分进行排序。,快速排序的排序算法,23,快速排序平均时间复杂度为O(nlog2 n)。 最坏情况下时间复杂度为O(n2),快速排序所需的比较次数反而最多。 快速排序法不稳定。,快速排序的排序算法分析,24,选择排序

10、,选择排序是指每次从待排序的记录中选出关键字值最小(或最大)的记录,顺序放在已排序的有序序列中,直到全部排完。选择排序主要包括简单选择排序和堆排序两种。,25,选择排序简单选择排序,首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换。再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换。重复上述操作,共进行n-1趟排序后,排序结束。,26,选择排序简单选择排序,首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换。 再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换。

11、 重复上述操作,共进行n-1趟排序后,排序结束。,27,例,初始: 49 38 65 97 76 13 27 ,i=1,13,49,一趟: 13 38 65 97 76 49 27 ,i=2,27,38,六趟: 13 27 38 49 65 76 97 ,排序结束: 13 27 38 49 65 76 97,28,(1)查找待排序序列中最小的记录,并将它和该区间第一个记录交换; (2)重复(1)到第n-1次排序后结束。,简单选择排序算法,29,简单选择排序所需要的总的比较次数为O(n2 )。当初始文件是有序时,最小移动记录次数等于0,而当初始文件是逆序时,每次都要交换记录 。 直接选择排序是不

12、稳定的.,简单选择排序算法分析,30,选择排序堆排序的引入,堆排序是简单选择排序的改进。用直接选择排序从n个记录中选出关键字值最小的记录要做n-1次比较,然后从其余n-1个记录中选出最小者要作n-2次比较。显然,相邻两趟中某些比较是重复的。为了避免重复比较,可以采用树形选择排序比较。,31,(a)求出最小关键字3 (b) 求出次小关键字11 图 8.8 树形选择排序,32,树形选择排序总的比较次数为O(nlog2 n),与直接选择排序比较,减少了比较次数,但需要增加额外的存储空间存放中间比较结果和排序结果。,选择排序堆排序的引入,33,n个元素的序列(k1,k2,kn),当且仅当满足下列关系时

13、,称之为堆,例 (96,83,27,38,11,9),例 (13,38,27,50,76,65,49,97),可将堆序列看成完全二叉树,则堆顶 元素(完全二叉树的根)必为序列中 n个元素的最小值或最大值,堆的定义,34,堆排序的基本思路:对一组待排序的记录序列,先将其关键字按堆的定义排列个序列(称初建堆),找到了最小(最大)关键字,将其取出。用剩余的n-1个元素再重建堆,便可得到次小(次大)值。如此反复执行,直到全部关键字排好序为止。,堆排序的基本思路,35,例,36,37,38,堆排序的关键问题,堆排序需解决的两个问题: 如何由一个无序序列建成一个堆? 如何在输出堆顶元素之后,调整剩余元素,

14、使之成为一个新的堆?,39,堆排序的关键问题,第二个问题解决方法筛选 方法:输出堆顶元素之后,以堆中最后一个元素替代之;然后将根结点值与左、右子树的根结点值进行比较,并与其中小者进行交换;重复上述操作,直至叶子结点,将得到新的堆,称这个从堆顶至叶子的调整过程为“筛选”。 第一个问题解决方法建堆 方法:从无序序列的第n/2个元素(即此无序序列对应的完全二叉树的最后一个非终端结点)起,至第一个元素止,进行反复筛选。,40,例:含8个元素的无序序列(49,38,65,97,76,13,27,50),建堆过程:,41,堆排序只需要一个记录大小的辅助空间。 堆排序算法的时间复杂度为O(nlogn)。 堆

15、排序是一种不稳定的排序方法。,堆排序的算法及分析,42,归并排序,归并排序:把两个或多个有序表进行合并,得到一个新的有序表。将两个有序子文件合并成一个有序文件,称为二路归并。,43,设初始序列含有n个记录,则可看成n个有序的子序列,每个子序列长度为1。两两合并,得到n/2个长度为2或1的有序子序列。再两两合并,如此重复,直至得到一个长度为n的有序序列为止。,2-路归并排序过程,44,例,初始关键字: 49 38 65 97 76 13 27,一趟归并后: 38 49 65 97 13 76 27,二趟归并后: 38 49 65 97 13 27 76,三趟归并后:,13,27,38,49,65

16、,76,97,2-路归并排序过程,45,基数排序,基数排序不需要进行关键字的比较和记录的移动,它是一种基于多关键字排序的思路而对单逻辑关键字进行排序的一种内部排序方法。 根据组成关键字的每个位的有效值,用“分配”和“收集”的方法进行排序。 例如:扑克牌的排序过程,46,各种内部排序方法性能比较,47,1)从平均时间而言:快速排序最佳。但在最坏情况下时间性能不如堆排序和归并排序。 2)从算法简单性看:由于直接选择排序、直接插入排序和冒泡排序的算法比较简单,将其认为是简单算法,都包含在上图中的“简单排序”中。对于希尔排序、堆排序、快速排序和归并排序算法,其算法比较复杂,认为是复杂排序。 3)从稳定

17、性看:直接插入排序、冒泡排序和归并排序是稳定的;而希尔排序、直接选择排序、快速排序和堆排序是不稳定排序。 4)从待排序的记录数n的大小看,n较小时,宜采用简单排序;而n较大时宜采用改进排序。,各种内部排序方法性能比较,48,(1)当待排序记录数n 较大时,若要求排序稳定,则采用归并排序。 (2)当待排序记录数n 较大,关键字分布随机,而且不要求稳定时,可采用快速排序; (3)当待排序记录数n 较大,关键字会出现正、逆序情形,可采用堆排序(或归并排序)。 (4)当待排序记录数n 较小,记录已接近有序或随机分布时,又要求排序稳定,可采用直接插入排序。 (5)当待排序记录数n 较小,且对稳定性不作要求时,可采用直接选择排序。,选择排序的方法,第八章 排序,内容提要: 内部排序方法(插入排序、交换排序、选择排序)的基本思想、排序过程、实现的算法、算法的效率分析及排序的特点;各种排序方法的比较和选择;最后简单介绍归并排序 基数排序 外部排序。,本章要点,排序的概念和有关知识;插入排序、交换排序、选择排序方法的基本思想、排序过程、实现的算法、算法的效率分析及排序的特点 。 各种内部排序方法的优缺点及不同的应用场合选择合适的方法进行排序 。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报