版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章排序与选择6.3快速排序算法6.4合并排序算法6.5线性时间排序算法6.6中位数与第k小元素6.1简单排序算法6.2堆排序算法2023/2/316.1.1冒泡排序基本思想:将第一个记录的关键字与第二个记录的关键字进行比较,若为逆序(即:a[0].key>a[1].key),则交换;然后比较第二个记录与第三个记录;依次类推,直至第n-1个记录和第n个记录比较为止——第一趟冒泡排序,结果关键字最大的记录被安置在最后一个记录上对前n-1个记录进行第二趟冒泡排序,结果使关键字次大的记录被安置在第n-1个记录位置重复上述过程,直到“在一趟排序过程中没有进行过交换记录的操作”为止6.1简单排序算法2023/2/32例:49389776132730初始关键字38497613273097第一趟384913273076第二趟3813273049第三趟13273038第四趟132730第五趟384976971397279730971376767627301349274930491338383038272023/2/33算法描述算法分析时间复杂度最好情况(正序)比较次数:n(n-1)/2交换次数:0最坏情况(逆序)比较次数:交换次数:∴T(n)=O(n²)2023/2/346.1.2直接插入排序基本思想:
整个排序过程为n-1趟插入,即先将序列中第1个记录看成是一个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序列有序。6.1简单排序算法2023/2/35例
49386597761327i=138(3849)6597761327i=265(384965)97761327i=397(38496597)761327i=476(3849657697)1327i=513(133849657697)27i=0()i=6(133849657697)2727j=i-1jjjjj977665493827
(13273849657697)排序结果:2023/2/36算法分析时间复杂度若待排序记录按关键字从小到大排列(正序)关键字比较次数:记录交换次数:若待排序记录按关键字从大到小排列(逆序)关键字比较次数:记录交换次数:∴T(n)=O(n²)算法描述2023/2/376.1.3选择排序基本思想:首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换;再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换;重复上述操作,共进行n-1趟排序后,排序结束。6.1简单排序算法2023/2/38例初始:[49386597761327]kjjjjjjkki=01349一趟:
13[386597764927]i=1kkjjjjj2738二趟:1327[6597764938]三趟:132738[97764965]四趟:13273849[769765]五趟:1327384965[9776]六趟:132738496576[97]排序结束:
132738496576972023/2/39算法描述算法评价时间复杂度记录交换次数:最好情况:0最坏情况:n-1比较次数:∴T(n)=O(n²)返回章目录2023/2/3106.2快速排序算法
6.2.0算法的基本策略思想——非平衡、预处理二分分治第一步对于给定的数组a[p:r],p<r,以x=a[p]为基准,调整a[p:q],使得能够确定一个下标q,p≦q≦r,将a[p:r]分成3段,即:a[p:q-1],a[q]和a[q+1:r],满足a[p:q-1]中的任一元素都不大于x,同时,a[q+1:r]中的任一元素都不小于x;这叫划分(Partition)。第二步将这种策略依次分别递归地运用于a[p:q-1]和a[q+1:r],使得a[p:q-1]和a[q+1:r]分别从小到大排好序;从而达到数组a[p:r]从小到大就地排好序。2023/2/3116.2快速排序算法
6.2.1快速排序(QuickSort)算法的实现://对a[0:n-1]快速排序只要调用QuickSort(a,0,n-1);
2023/2/3126.2.2划分(Partition)的实现2023/2/3136.2.3算法的性能分析
快速排序的运行时间与划分是否平衡密切相关。对于输入序列a[0:n-1],Partition的计算时间显然为O(n)。它的最坏情况发生在划分产生的两段分别包含n-1个元素和1个元素的时候。如果算法每一次调用Partition都出现这种不平衡划分,则QuickSort(a,0,n-1)的耗时T(n)满足2023/2/314算法的性能分析:在最好情况下,每次划分所取的基准都恰好为中值,即每次划分都产生大小相当的2段,则T(n)满足2023/2/3156.2快速排序算法6.2.4随机快速排序算法(1)算法的动因可以证明,如果在a[0:n-1]中选择的作为划分(Partition)的基准值是随机的,那么,快速排序算法在平均情况下的时间复杂性就是O(nlogn),即达到基于比较的排序算法类中的最好水平。因此,人们提出:划分(Partition)的基准值不固定为数组的第1个值而是随机在a[p:r]中地挑选。其他思想不变,这就是随机快速排序算法。2023/2/3166.2.4随机快速排序算法(续)
(2)随机版的划分的实现2023/2/3176.2.4随机快速排序算法(续)(3)随机快速排序算法的实现返回章目录2023/2/3186.3合并排序算法(非就地)
6.3.1递归版的合并排序算法(1)基本策略思想——平衡、简单二分分治:将待排序元素序列简单地分成大小大致相等的左右两段,接着依次分别对这两段子序列递归地进行合并排序,然后利用这两段子序列已得到的有序性,将它们有序地合并在一个工作区,最后用工作区中排好序的全序列更新原待排序的元素序列成为所要求的排好序的元素序列。2023/2/3196.3合并排序算法(非就地)
6.3.1递归版的合并排序算法(2)算法的实现2023/2/320R.Sedgewick发明的一个优化归并排序方法:2023/2/3216.3合并排序算法(非就地)
6.3.1递归版的合并排序算法算法的复杂度显然,Copy可在O(n)时间内完成。也容易理解,Merge可在O(n)时间内完成。因此合并排序算法对n个元素进行排序,在最坏情况下所需的计算时间T(n)满足解此递归方程可知T(n)=O(nlogn)。由于基于比较的排序问题的计算时间下界为Ω(nlogn),故合并排序算法是一个渐近最优算法。但它需要加倍的空间,即需要O(n)的辅助空间。2023/2/3226.3合并排序算法(非就地)
6.3.2非递归版的合并排序算法(1)基本思想
事实上,
算法MergeSort的递归过程只是将待排序数组一分为二,直至待排序数组中只有1个元素为止(它已有序)。然后不断地合并相邻的2个已有序的数组段。按此机制,可以首先将数组a中相邻元素两两配对。用Merge算法将它们合并,得到n/2个长度为2的排好序的数组段。然后再将它们Merge成长度为4的排好序的数组段,…,如此继续下去,直至整个数组排好序。2023/2/3236.3合并排序算法(非就地)
6.3.2非递归版的合并排序算法(2)算法的实现2023/2/3246.3合并排序算法(非就地)
6.3.2非递归版的合并排序算法(3)需要的函数2023/2/3256.3合并排序算法(非就地)6.3.3自然合并排序算法(1)基本思想事实上,任意给定的数组a都是由不多于n段自然有序的子数组拼接起来的,如{4,8,3,7,1,5,6,2}就是由自然排好序的子数组{4,8},{3,7},{1,5,6}和{2}拼接起来的。而且可以在O(n)的时间里把这些子数组的界限找出来。因此我们不妨按照这种自然的有序段,通过调用Merge(c,d,
l,m,r)反复地合并其相邻的两段,最后也可达到将a排序的目的。例如由{4,8,3,7,1,5,6,2}⇒{4,8},{3,7},{1,5,6}和{2}⇒{3,4,7,8}和{1,2,5,6}⇒{1,2,3,4,5,6,7,8}。返回章目录2023/2/3266.4特殊有序集的线性时间排序算法6.4.0引言到目前为止,所讨论的排序算法有2个共同的特点:(1)它们要排序的集合的全集的基数没有限制。(2)它们用于确定排序结果的主要运算是输入元素间的比较。这类排序算法称为基于比较的排序算法。基于比较的排序算法的计算时间下界是Ω(nlogn)。本节讨论要排序的集合的全集的基数m有限制的情形。对这种情形的排序,有比基于比较更有效的算法——线性时间排序算法,但是,它们都要以花费更多的空间为代价。
2023/2/3276.4特殊有序集的线性时间排序算法6.4.1计数排序算法
(1)算法的基本思想:对于要排序的a[0:n-1]中的每一个元素,设法计算出它在最终排序结果序列中的序号,然后对号入座。设全集S的基数为m。由于S的有序性,我们可以按照它的序,给S的元素设立一个计数器数组c[0:m]。其中的c[i]用来统计S的第i个元素出现在a[0:n-1]中的次数,i=1,2,3,…,m。由c[0:m]便可计算出a[0:n-1]中每一个元素在排序结果序列中的序号,从而解决a[0:n-1]的排序问题。2023/2/3286.4特殊有序集的线性时间排序算法6.4.1计数排序算法
(2)算法的实现:2023/2/3296.4特殊有序集的线性时间排序算法6.4.1计数排序算法
(3)算法的复杂度分析:对数组c初始化需要O(m)的时间。统计出现在a[0:n-1]中的元素的出现次数需要O(n)的时间。对所有i统计出现在a[0:n-1]中的元素值小于或等于i(1≦i≦m)的元素个数需要O(m)的时间。最后,让a[0:n-1]中的所有元素到达排序结果数组b中正确位置需要O(n)的时间。这样,整个算法所需的计算间为O(m+n)。当m=O(n)时算法的计算时间复杂性为O(n)。算法需要的空间显然为O(m)。2023/2/3306.4特殊有序集的线性时间排序算法6.4.2桶排序算法(1)算法的基本思想:
给全集的每一个元素键值设一个相应的桶,并将要排序的元素按键值对号入桶,让同一个桶内的元素保有它们被输入时的相对顺序;然后利用全集的有序性,按键值的序收集各相应的桶中的元素。这样,所得到的元素序列就是所要求的排好序的序列。2023/2/3316.4特殊有序集的线性时间排序算法6.4.2桶排序算法(2)实现算法的准备—数据结构的选择待排序的元素序列:用单链实现的表List<T>
排好序的元素序列:用单链实现的表List<T>
同一个桶中的元素序列:用单链实现的队列。它以分别指向队首和队尾结点的两个指针为标识。
a(1)a(2)a(3)0a(n)……first0a(in)a(i3)a(i2)a(i1)……first0b(k)b(3)b(2)b(1)……bottomtop2023/2/3326.4特殊有序集的线性时间排序算法6.4.2桶排序算法(2)实现算法的准备—数据结构的选择(续)为全集有序元素键值(在1与m之间)序列设置的桶序列:由两个指针数组bottom和top来表达。Bottom[i]和top[i]分别指向第i桶中元素队列首结点和尾结点。bi(1)bi(2)0bi(k)01immi10……bottom
top首结点尾结点2023/2/3336.4.2桶排序算法(3)算法的复杂度分析:桶排序算法与计数排序算法大致相同,它们都需要O(m+n)计算时间。初始化空桶需要O(m)时间。将所有待排序元素对号装入桶中共需O(n)时间。将桶中元素依序连接共需O(m)时间。于是,整个桶排序算法共要O(m+n)时间。与计数排序算法类似,如果m=O(n),则桶排序算法只需要O(n)计算时间。桶排序算法也需要O(m)的空间。2023/2/3346.5中位数与第k小元素
6.5.0引言(1)概念与术语中位数第k小元素(2)问题的提法:给定线性序集中n个元素和一个整数k,1≤k≤n,要求不经排序而找出这n个元素中第k小(大)的元素。当k=1时,就是要找最小(大)元素;当k=n时,就是要找最大(小)元素;当k=(n+1)/2时,就是要找中位元素。2023/2/3356.5.1平均情况下的线性时间选择算法(1)基本思想——不平衡、预处理的二分分治与二分查找类似。但二分查找的预处理只做一次,而且二分是平衡二分。这里借助随机划分RandomizedPartition做预处理,然后根据k值决定在分出的两段中哪一段递归地查找。2023/2/3366.5.1平均情况下的线性时间选择算法(2)算法的实现2023/2/3376.5.1平均情况下的线性时间选择算法(3)算法的复杂度分析容易看出,在最坏情况下,算法RandomizedSelect需要O(n2)的计算时间。例如在找最大元素时,总是在最小元素处划分。但该算法的平均性能很好。由于随机划分函数RandomizedPartition使用了一个随机数产生器Random,它能随机地产生p和r之间的一个随机整数,因此,RandomizedPartition产生的划分基准是随机的。在这个条件下,可以证明:算法RandomizedSelect可以在平均时间O(n)内找出n个输入元素中的第k小元素。
2023/2/3386.5.2最坏情况下的线性时间选择算法(1)Select算法的基本思想在线性时间内找一个划分基准,使得按这个基准将输入的数组划分成的两个子数组的长度,即使在最坏的情况下,也不会严重失衡,以便采用类似于RandomizedSelect的分治策略,在最坏情况下用O(n)的时间完成选择任务。2023/2/3396.5.2最坏情况下的线性时间选择算法(2)Select算法找划分基准的一种构思①不计n个输入元素的最后(nmod
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度物业管理合同:物业公司与业主委员会之间的物业管理协议3篇
- 2024年度教育机构讲师授课合同3篇
- 2024年建筑信息模型(BIM)技术服务合同
- 2024常备口罩采购商业协议模板定制版版B版
- 2024年快速快递服务运输合同
- 2024年企业间互保反担保合同范本一
- 2024年旅游领队协作合同样本
- 2024年小区物业综合管理服务协议版B版
- 2024专业监理额外责任合同样本
- 2024年度某石油公司与某化工企业关于某石油化工产品交易的合同
- 山东省临沂市河东区2023-2024学年九年级上学期期末数学试题
- (高清版)TDT 1031.1-2011 土地复垦方案编制规程 第1部分:通则
- 食堂出品方案
- 软件工程生涯发展报告
- 安格尔作品欣赏课件
- 保健按摩师-国家职业标准(2023年版)
- 四川仁寿红色革命
- GJB9001C内部审核检查表
- 就好医用分子筛制氧机课件
- 小区物业安全培训课件
- 2、爬架施工作业安全监控要点课件
评论
0/150
提交评论