




已阅读5页,还剩34页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
排序,10.1基本概念,排序是将一组任意序列的数据元素(记录),按由大到小的顺序(降序)排列或按由小到大的顺序(升序)排列。这些数据元素(记录)可以是数值型,也可以为字符型。若为数值型,则按数值大小排列;若为字符型,则按其ascii码的顺序排列。,排序的分类,(1)根据排序过程中所涉及的存储器,可分为内部排序和外部排序。内部排序:排序的所有记录都是在计算机的内存中进行的。外部排序:必须要借助于外存才能进行的排序。(2)按排序的稳定性,可将排序分为稳定排序和不稳定排序。设两个记录ri与rj的关键字为ki与kj,若ki=kj;若在排序前的序列中ri在rj之前(即ij),且在排序后的序列中ri仍在rj之前,则称所用的排序方法是稳定的,即稳定排序;反之,若排序后ri在rj之后,则称所用的排序方法是不稳定的,即不稳定排序。(3)按排序所采用的策略,可将排序分为插入排序、交换排序、选择排序、归并排序和基数排序。,排序的分类,插入排序直接插入排序、希尔排序(略)交换排序冒泡排序、快速排序选择排序直接选择排序、堆排序(略)归并排序基数排序(略),10.2插入排序,待排序记录的数据结构:假定待排序记录是整型数据,记录的关键字即为该整数,记录个数为n,这一组记录存放在数组r中,且排序是按关键字由小到大的顺序排序。插入排序基本思想:就是依次将无序序列中的一个待排序记录,按其关键字值的大小插入到已排好序的子序列的适当位置,使得该序列有序,直到整个记录序列有序为止。由于查找待排序记录的插入位置的方法不同,插入排序的方法也有多种,本节介绍最简单的插入排序:直接插入排序。,10.2.1直接插入排序,假设待排序的记录序列为r1,r2,r3,rn,将该序列分成两部分,前一部分r1,r2,ri-1是(1in)已排好序的,后一部分ri,ri+1,rn是未排好序的。这时,用未排序记录序列中的第一个记录ri分别与记录r1,r2,ri-1进行比较,找出相应的插入位置,然后将记录ri插入到该位置,原位置的记录向后顺推,重复这个插入过程,直到所有未排序部分的记录都插入到有序序列中。,直接插入排序的基本思想是:,在直接插入排序过程中,每将一个记录插入到前面已排好序的记录序列中,称为一趟直接插入排序。一趟插入排序的基本思想为:将记录ri插入到有序子序列r1.i-1中,使记录的有序序列从r1.i-1变为r1.i。显然,完成这个“插入”需分三步进行:(1)查找ri的插入位置j+1;(2)将rj+1.i-1中的记录后移一个位置;(3)将ri复制到rj+1的位置上。,已知一关键字序列(48,62,35,77,55,14,35,98),请给出采用直接插入排序的方法对这8个数按升序排序时的每一趟排序过程。,例,voidinsertsort(intr,intn)inti,j,;for(i=2;i=n;i+)r0=ri;/*r0中存放待插入记录*/j=i-1;/*在有序子序列中查找它的插入位置*/while(r0rj)rj+1=rj;j-;/*将所有比它大的记录后移*/rj+1=r0;/*将待插入记录插入*/,直接插入排序的算法:,直接插入排序算法的性能,时间复杂度:直接插入排序的时间复杂度为(n2)。空间复杂度:从所需的附加空间来看,直接插入排序只需要一个记录的附加空间,所以其空间复杂度为(1)。稳定性:从排序的稳定性来看,直接插入排序是稳定的。,从键盘上输入10个整数,用直接插入排序的方法对这10个数按由大到小的顺序排序并输出。编写出相应的c语言程序。分析:需要注意是,在介绍直接插入排序算法时,排序是按由小到大的顺序排列,而本例要求是按由大到小的顺序排列。所以,在寻找插入位置时,要将上面算法的for语句中的条件r0rj。对上面算法稍作修改,写出本例的c语言程序如下:,例10-1,#definen10#includevoidmain()inti,j,rn+1;for(i=1;irj;j-)rj+1=rj;rj+1=r0;for(i=1;ir2,则交换记录r1和r2,否则不交换。然后再对r2和r3进行同样的比较,依次类推,直到序列中的最后两个记录处理完为止。这样的一个过程就叫做一趟冒泡排序。这样,在一趟比较完毕后,关键字值最大的记录就被交换到最后,然后再对前面的n-1个记录执行上述过程,如此重复n-1次。,已知一关键字序列(35,14,8,16,39,2,27),请给出采用冒泡排序的方法对这7个数按升序排序时的第一趟排序过程。,例,voidbubblesort(intr,intn)inti,j;for(i=1;irj+1)r0=rj;/*交换两个记录*/rj=rj+1;rj+1=r0;,冒泡排序的算法:,从算法可知,对n个记录进行排序需要进行n-1趟排序。但实际上,除非是逆序的情况,一般情况下不需要进行n-1趟。,voidbubblesort(intr,intn)inti,j,flag;/*flag记录一趟排序过程中是否有记录交换*/flag=1;/*flag=1表示有记录交换,=0表示无交换*/for(i=1;irj+1)flag=1;/*发生交换时,设flag=1*/r0=rj;rj=rj+1;rj+1=r0;,冒泡排序改进后的算法:,时间复杂度:冒泡排序算法的时间复杂度为(n2)。空间复杂度:从所需的附加空间来看,冒泡排序仅需一个记录的附加空间,所以其空间复杂度为(1)。稳定性:从排序的稳定性来看,冒泡排序是稳定的。,冒泡排序算法的性能:,用冒泡法将从键盘输入的10个整数按由小到大的顺序排序。,例10-2,#definen10#includemain()intrn+1,i,j;intflag=1;for(i=1;i=n;i+)scanf(%d,for(j=1;jrj+1)flag=1;r0=rj;rj=rj+1;rj+1=r0;for(i=1;i=n;i+)printf(%d,ri);,程序如下:,10.3.2快速排序,任意选取记录序列中的一个记录作为基准记录ri(一般可取第一个记录r1),把它和所有待排序记录比较,将所有比它小的记录都置于它之前,将所有比它大的记录置于它之后,这一个过程称为一趟快速排序。经一趟快速排序后,将待排序记录序列划分成左右两部分,然后分别对这两部分重复上述过程进行排序,直到每一部分的记录个数为1为止。,快速排序的基本思想,已知一关键字序列(33,85,64,15,73,56,42,20),请给出采用快速排序的方法对这8个数按升序排序时的第一趟排序的过程。,例,设两个指针i、j分别指向无序区的第一个和最后一个记录的位置,选取区域第一个记录r1作为基准记录。从区域右端开始,自右向左逐个记录依次和r1比较,当某个记录比r1小时,把该记录移到左端,然后从区域的左端开始,自左向右逐个记录依次和r1比较,当某个记录比r1大时,把该记录移到右端;又从右端第一个未比较的记录开始重复上述步骤,直到r1与无序区中的所有记录都比较过。,快速排序的实现方法,写出对下列一组数(5623307890654286)进行快速排序时,每一趟排序的状态。快速排序的每一趟结果为:,例10-3,初始状态:5623307890654286第一趟排序后:4223305690657886第二趟排序后:3023425686657890第三趟排序后:2330425678658690第四趟排序后:2330425665788690结果为:2330425665788690,quicksort.c,时间复杂度:平均情况,快速排序的时间复杂度为(nlog2n)。空间复杂度:从所需的附加空间来看,(log2n)。稳定性:从排序的稳定性来看,快速排序是不稳定的。,快速排序算法的性能,10.4选择排序,选择排序是不断的从待排序的记录序列中选取关键字最小的记录,依次放到已排好序的子序列的最后,直到全部记录排好序。最常用选择排序有简单选择排序和堆排序。,第一趟从所有的n个记录中,通过顺序比较各关键字的值,选取关键字值最小的记录与第一个记录交换;第二趟从剩余的n-1个记录中选取关键字值最小的记录与第二个记录交换;,第i趟从剩余的n-i+1个记录中选取关键字值最小的记录,与第i个记录交换;经过n-1趟排序后,整个序列就成为有序序列。,简单选择排序的基本思想,初始关键字:3385641573564220第一趟排序后:1585643373564220第二趟排序后:1520643373564285第三趟排序后:1520336473564285第四趟排序后:1520334273566485第五趟排序后:1520334256736485第六趟排序后:1520334256647385第七趟排序后:1520334256647385最后结果:1520334256647385,例:对33、85、64、15、73、56、42、20关键字序列,用简单选择排序法排序的过程如下图所示。假设为有序区,为无序区。,voidselectionsort(intr,intn)inti,j,k;for(i=1;i=n-1;i+)k=i;for(j=i+1;j=n;j+)if(rjrk)k=j;if(i!=k)r0=rk;rk=ri;ri=r0;,简单选择排序的算法,时间复杂度:简单选择排序的时间复杂度为o(n2)。空间复杂度:从所需的附加空间来看,其空间复杂度为o(1)。稳定性:从排序的稳定性来看,简单选择排序是不稳定的。,简单选择排序算法的性能,从键盘上输入n个数,要求用简单选择排序算法对这n个数按由大到小的顺序排序并输出。程序如下:,#definen15voidselectionsort(intr,intn);main()inti,an+1;for(i=1;i=n;i+)scanf(%d,voidselectionsort(intr,intn)inti,j,k;for(i=1;irk)k=j;if(i!=k)r0=rk;rk=ri;ri=r0;,例10-4,10.5归并排序,将初始的n个待排序记录,看成是n个长度为1的有序子序列,从第1个子序列开始两两归并,得到n/2个有序子序列。我们把这一个过程称为一趟归并排序。然后再对n/2个有序子序列进行两两归并,如此重复,直到得到一个长度为n的有序序列为止。,由于在归并排序的过程中子序列总是两两归并的,所以把这种排序方法称为2-路归并排序。2-路归并排序的核心是如何将相邻的两个有序序列归并成一个有序序列。,归并排序的基本思想,初始关键字20517033154862第一趟归并后20513370154862第二趟归并后20335170154862最后一趟归并结果15203348516270,例:一个2-路归并排序过程示意图。,时间复杂度:归并排序的时间复杂度为o(nlog2n)。空间复杂度:归并排序需要和待排序记录相等数量的辅助空间,所以归并排序的空间复杂度为o(n)。稳定性:在归并排序过程中的主要操作是有秩序的复制记录,因此它是一种稳定的排序方法。,2-路归并排序的算法性能,10.6各种内排序算法的比较,本章所讨论的排序算法都是在顺序存储结构上实现的,所有的排序算法都需要通过关键字比较和记录移动来完成排序。每一种排序算法的时间和空间复杂度及稳定性各不相同。本章中主要内部排序算法的性能比较如下表所示:,(1)就平均时间性能而言,快速排序和归并排序有最好的时间性能。相对而言,快速排序速度最快。但快速排序在最坏情况下的时间性能达到了o(n2),不如归并排序。(2)就空间性能来看,直接插入排序、折半插入排序、冒泡排序、简单选择排序要求的辅助空间较小,但时间性能较差。(3)从稳定性来看,除快速排序和简单选择排序是不稳定的外,其他的几种排序方法都是稳定的。(4)另外,从待排序记录的个数来看,当待排序记录的个数较少时,采用直接插入排序、折半插入排序或简单选择排序较好;当待排序记录的个数较多时,采用快速排序或归并排序较合适。,结论:,10.7内排序算法举例,已知一关键字序列(503,87,512,908,170,276,436,316),请给出采用下列算法对该序列按升序排序时的每一趟的排序结果。(1)直接插入排序;(2)冒泡排序;(3)快速排序;(4)简单选择排序;(5)归并排序。,例10-5,(1)直接插入排序各趟排序的结果为:,初始关键字:50387512908170276436316第一趟排序:87503512908170276436316第二趟排序:87503512908170276436316第三趟排序:87503512908170276436316第四趟排序:87170503512908276436316第五趟排序:87170276503512908436316第六趟排序:87170276436503512908316第七趟排序:87170276316436503512908,(2)冒泡排序各趟排序的结果为:,初始关键字:50387512908170276436316第一趟排序:87503512170276436316908第二趟排序:87503170276436316512908第三趟排序:87170276436316503512908第四趟排序:87170276316436503512908第五趟排序:87170276316436503512908,例10-5续,(3)快速排序各趟排序的结果为:,初始关键字:50387512908170276436316第一趟排序:31687436276170503908512第二趟排序:17087276316436503512908第三趟排序:87170276316436503512908最后结果:87170276316436503512908,(4)简单选择排序各趟排序的结果为:,初始关键字:50387512908170276436316第一趟排序:875035129
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高校会计视角下资产账面差异审计风险分析
- 成本会计核算面试题及答案
- 2025年长春入培训考试题及答案
- 医学生期末模拟考试题及答案
- 比较文学诗歌专题考试题
- 心理能力大赛题库及答案
- 高二上英语模拟试题及答案
- 2025报关员考试真题及答案解析大全
- 房屋气候适应性设计方案
- 气化工考试题题库及答案
- 小学语文论文:浅谈小学六年级语文有效教学
- 华中科技大学教学课件-工程传热学1王晓墨
- 学生资助政策宣传主题班会PPT
- 大一统专题复习-高中历史教学资料
- YS/T 1018-2015铼粒
- 【高等数学练习题】沈阳大学专升本自考真题汇总(附答案解析)
- 自驾游免责协议书
- 合作项目管理办法
- 建设项目安全设施“三同时”检查表
- 第五章-中药指纹图谱课件
- 《汽轮机原理》多级汽轮机
评论
0/150
提交评论