第10章-内部排序.ppt_第1页
第10章-内部排序.ppt_第2页
第10章-内部排序.ppt_第3页
第10章-内部排序.ppt_第4页
第10章-内部排序.ppt_第5页
免费预览已结束,剩余37页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,第10章 内部排序,主要内容: 排序的基本概念 插入排序 交换排序 选择排序 归并排序 各种排序方法的比较,2,10.1 概述,1. 基本概念 排序:将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列的过程叫排序。 设序列R1, R2, , Rn,相应关键字序列为 K1, K2, , Kn ,所谓排序是指重新排列 R1, R2, , Rn 为 Rp1, Rp2, , Rpn ,使得满足: Kp1Kp2 Kpn 或 Kp1Kp2 Kpn,排序的稳定性:假设KiKj,(1in; 1jn; ij)且在排序前的序列中Ri领先于Rj,如在排序后Ri仍领先于Rj,则称所用的排序方法是

2、稳定的,反之则称排序方法是不稳定的。,3,2. 排序的分类,待排序记录所在位置 内部排序:待排序记录存放在内存中 外部排序:排序过程中需对外存进行访问的排序,内部排序适用于记录个数不很多的小文件; 外部排序则适用于记录个数太多,不能一次将其全部放入内存的大文件,排序依据策略 插入排序:直接插入排序, 折半插入排序, 希尔排序 交换排序:冒泡排序, 快速排序 选择排序:简单选择排序, 堆排序 归并排序:2-路归并排序 基数排序,4,3. 排序的基本操作,排序的基本操作: 比较操作:比较两个关键字的大小 改变指向记录的指针(逻辑关系)或将一个记录从一个位置移动到另一个位置,5,4. 数据的存储形式

3、,待排记录一般有三种存储形式 存放在一组地址连续的存储单元中,类似顺序表 实现排序必须借助移动记录 存放在静态链表中 实现排序只需修改指针 存放在一组地址连续的存储单元中,同时另设一个指示各个记录存储位置的地址向量 实现排序时修改地址向量中的地址,排序结束时统一调整记录的存储位置,6,顺序存储结构定义,#define MAXSIZE 20 /顺序表的长度 typedef int KeyType; /关键字类型为整数类型 typedef struct KeyType key; /关键字项 InfoType otherinfo; /其它数据项 RedType; /记录类型 type struct

4、RedType rMAXSIZE+1; /r0空作为哨兵 int length; /顺序表长度 SqList; /顺序表类型,7,5. 算法复杂度分析,评价排序算法的标准: 执行时间 所需辅助空间 稳定性,排序所需时间 简单排序:T(n)=O(n2) 先进的排序:T(n)=O(logn) 基数排序:T(n)=O(d.n),排序算法的时间开销 主要是关键字的比较次数和记录的移动次数。 有的排序算法其执行时间不仅依赖于问题的规模,还取决于输入实例中数据的状态。,排序算法的空间开销 若所需辅助空间不依赖于问题的规模n,即辅助空间为O(1),则称为就地排序。 非就地排序所要求的辅助空间一般为O(n),

5、8,10.2 插入排序,1. 插入排序的基本思想 基本思想:设R=R1,R2,Rn为原始序列,R= 初始为空。插入排序就是依次取出R中的元素Ri,然后将Ri有序地插入到R中。 例如:,R=5,2,10,2,R= ,R=2,10,2,R=5,R=10,2,R=2,5,5,R=2,2,R=2,5,10,R= ,10,R=2,2,5,10,2,9,2. 直接插入排序,排序过程:整个排序过程为n-1趟插入 将序列中第1个记录看成是一个有序子序列 从第2个记录开始,逐个进行插入,直至整个序列有序,若R1.i-1为有序区,寻找Ri插入位置的方法: 在R0处设置监视哨,即令:R0=Ri 从j=i-1的记录位

6、置开始依次向前比较 若Ri.keyRj.key,Rj后移,否则插入位置找到,将Ri插入到第j+1个位置,10,算法程序,viod Dinsertsort(Sqlist /将Ri插入到位置j+1 ,11,算法效率,时间复杂度 待排序记录按关键字从小到大排列(正序),待排序记录按关键字从大到小排列(逆序),待排序记录随机,取平均值,总的时间复杂度:T(n)=O(n2),空间复杂度:S(n)=O(1),12,3. 折半插入排序,排序过程:用折半查找方法确定插入位置。 举例:,i=1: (49) 38 65 97 76 13 27 49,(38),i=2: (38 49) 65 97 76 13 27

7、 49,(65),i=8: (13 27 38 49 49 65 76 97),13,算法程序,void BInsertSort ( Sqlist ,算法效率 时间复杂度(只改善了比较): T(n)=O(n2) 空间复杂度: S(n)=O(1) 折半插入排序是稳定的排序,14,4. 希尔排序,希尔排序(Shells Sort)又称“缩小增量排序”,基本思想为:把一个较长的待排序列分成若干段,n=n1+n2+nk;然后,分别对各段进行直接插入排序,使得整个序列基本有序;最后对整个序列进行一次直接插入排序。 希尔排序过程:先取一个正整数间隔d1n,把所有相隔d1的记录放一组,组内进行直接插入排序;

8、然后取d2d1,重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止,若待排记录为“正序”时,时间复杂度为O(n),即待排记录基本有序时,效率高;当n很小时,效率也很高。,15,举例,49 38 65 97 76 13 27 49 55 04,3趟分组(d3=1),13 4 49 38 27 49 55 65 97 76,1趟分组(d1=5),49 38 65 97 76 13 27 49 55 4,2趟分组(d2=3),13 27 49 55 4 49 38 65 97 76,最后一趟移动记录5次, 共移动记录10次; 直接插入排序共移动27次,16,算法效率,希尔排序当dk

9、=2(t-k+1)-1时(t为排序的总趟数, k为第k趟排序),可提高排序速度为O(n3/2),因为: 插入排序时T(n)=O(n2),而分组后n值减小,n2更小 关键字较小的记录跳跃式前移,在进行最后一趟增量为1的插入排序时,序列已基本有序 根据经验统计,希尔排序所需比较和移动次数约为n1.3,当n时,可减少到n(log2n)2。 希尔排序不稳定 增量序列取法 无除1以外的公因子 希尔给出:d1=n/2,di+1=di/2 最后一个增量值必须为1,17,10.3 交换排序,1. 交换排序的基本思想 基本思想:在待排序列中选两个记录,将它们的关键码相比较,如果反序(即排列顺序与排序后的次序正好

10、相反),则交换它们的存储位置。 特点:通过交换,将关键字值较大的记录向序列的后部移动,关键字较小的记录向前移动。 典型算法 冒泡排序 快速排序,18,2. 冒泡排序,基本思想 在n个记录中,将相邻两个记录进行比较,若ri.keyri+1.key (i=1,2,n),则交换(第一趟冒泡排序),结果关键字最大的记录被放在rn。 在n-1个记录中,若ri.keyri+1.key (i=1,2,n-1),则交换,结果关键字次大的记录被安置在rn-1 以此类推,直到“在一趟排序过程中没有进行过交换记录的操作”为止,19,算法程序,void Bubble_sort(Sqlist ,20,性能分析,时间复杂

11、度 最好情况(正序):比较1趟n-1次,不移动,总的时间复杂度:O(n2),空间复杂度:S(n)=O(1) 冒泡排序是稳定的排序,21,2. 快速排序,基本思想:选择一个枢轴,通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后分别对这两部分记录进行排序,以达到整个序列有序。,排序过程: 设序列为r1, r2, , rn,定r1为枢轴 设low, high指针分别从两端与枢轴比较,把比r1小的记录放前,比r1大的记录放后,得到一次划分: rs1, rs2, , rsk, r1, rt1, rt2, , rtj 然后分别对两序列rs和rt再进行划分

12、,直到划分后的序列剩一个元素为止,这是一个递归的过程,22,一趟分割过程,先从high所指记录向前搜索,找到第1个小于key的记录与枢轴交换。然后从low起向后搜索,找到第一个比key大的记录与low互换。重复上面两步,直到low=high为止(该位置即为枢轴的位置),初始关键字,L,1次交换之后,2次交换之后,3次交换之后,4次交换之后,完成一趟排序,H,L,H,L,23,快速排序整个过程,49,27,76,49,结束,结束,结束,结束,快速排序是不稳定的排序,24,int Partition(Sqlist ,25,算法效率分析,时间复杂度 最好情况:每次总是选到中间值作枢轴,则形成二叉递归

13、树:T(n)=O(nlog2n) 最坏情况:每次总是选到最小或最大元素作枢轴,则退化为冒泡排序:T(n)=O(n2) 平均时间复杂度:Tavg(n)= kn ln n ;k为某个常数 经验证明,在所有同数量级O(nlogn)的此类排序中,快速排序的常数因子k最小。因此,就平均时间而言,快速排序是速度最快的排序 若枢轴记录取rlow、r(low+high)/2和rhigh中关键字的中值的记录,并与rlow互换,可以大大改善最坏情况的快速排序 空间复杂度:使用栈空间实现递归 最坏情况:S(n)=O(n);一般情况:S(n)=O(log2n),26,10.4 选择排序,基本思想:每一趟在n-i+1(

14、i=1, 2, , n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。 1. 简单选择排序 排序过程: 设待排序列为:a1, a2, , an 在a1, a2, , an中,找最小值记录与a1交换 在a2, a3, , an中,找最小值记录与a2交换 重复上述操作,共进行n-1趟排序后,排序结束 简单选择排序是不稳定的排序,27,算法程序和效率分析,时间复杂度 移动次数:最好(正序): 0;最坏(逆序): 3(n-1) 比较次数:,void Selectsort(Sqlist ,总的时间复杂度:T(n)=O(n2) 空间复杂度:S(n)=O(1),28,2. 堆排序,(1) 堆和堆

15、排序 堆:n个元素的序列(a1, a2, , an),其关键值序列为:(k1, k2, , kn),当且仅当其关键值满足下式称之为堆:,满足前一表达式的堆称为小顶堆,即堆顶元素为所有元素中最小值;符合后一组不等式的堆称为大顶堆,即堆顶元素为所有元素中最大值。,考虑完全二叉树的顺序存储,若将其解释成堆如何?,29,举例,3, 7, 4, 9, 10, 8,96, 83, 27, 38, 11, 9,小顶堆,大顶堆,堆是具有如下性质的完全二叉树:若树中每个结点的值都小于等于(或大于等于)其左、右孩子结点的值,则从根结点开始按结点编号排列所得的结点序列就是一个堆。,注意:小顶堆中较小结点靠近根结点,

16、但不绝对。大顶堆中较大结点靠近根结点,但也不绝对,30,堆排序,堆排序:将无序序列建成一个堆,得到关键字最小(或最大)的记录;输出堆顶的最小(大)值后,使剩余的n-1个元素重又建成一个堆,则可得到n个元素的次小值;重复执行,得到一个有序序列,这个过程就叫堆排序。,排序过程(小顶堆) 若a1,a2,an为堆,则a1最小,交换a1,an,输出an 将剩余a1,a2,an-1调整为堆,当作新的序列 重复这个过程直到序列只剩一个元素,31,(2) 建立堆,算法描述(小顶堆) 首先把给定序列看成是一棵完全二叉树 从第i= 结点(最后一个非终端结点)开始与其子树结点比较,若其直接子树结点中较小者小于i结点

17、,则交换。若该直接子树结点交换后大于其孩子结点,继续交换,直到叶结点或不再交换,令i=i-1,重复前面的过程直到i=1,即到第1个结点为止,32,举例: 9 2 6 1 8 3,i2,i1,33,(3) 调整堆筛选,筛选:输出堆顶元素后,剩余元素重新调整为堆的过程。 调整步骤(小顶堆) 将该完全二叉树中最后一个元素替代已输出的结点 若新的完全二叉树的根结点小于左右子树的根结点,则直接输出。反之,则比较左右子树根结点的大小。若左子树的根结点小于右子树的根结点,则将左子树的根结点与该完全二叉树的根结点交换,否则将右子树与其交换。 重复上述过程,调整左子树(或右子树),直至叶子结点,则新的二叉树满足

18、堆的条件。,34,举例,堆排序的过程就是一个不断从堆顶到叶子的筛选过程,35,算法程序,void Heapadjust(Sqlist /剩余1.i-1个元素调整为堆,36,算法效率分析,时间复杂度 对深度为k的堆,筛选算法中进行关键字的比较次数至多为2(k-1)。建堆时,n个元素所需的比较次数不超过4n。总的比较次数:,在最坏情况下,其时间复杂度为O(n log n) 空间复杂度 仅需一个记录大小的辅助存储空间。 堆排序是不稳定的排序。,堆排序的运行时间主要耗费在建立初始堆和筛选上,当记录较少时,不值得提倡。当n很大时效率高,是常用算法。,37,10.5 归并排序,基本思想:将若干有序序列逐步归并,最终得到一个有序序列。 归并:将两个或两个以上的有序表合并成一个新的有序表的过程。,归并排序有多路归并排序、两路归并排序 , 可用于内排序,也可以用于外排序。,2-路归并排序 设初始序列含有n个记录,看成n个有序的子序列,每个子序列长度为1 两两合并,得到 个长度为2或1的有序子序列 对n/2个有序表两两合并,得到n/4个长度为4或3的有序表 重复这个过

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论