




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
快速排序是对冒泡排序的一种改进。它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。假设要排序的数组是A1AN,首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序。一躺快速排序的算法是: 1)、设置两个变量I、J,排序开始的时候i:=l,j:=r; 2)以第一个数组元素作为关键数据,赋值给X,即x:=A1; 3)、从J开始向前搜索,即由后开始向前搜索(j:=j-1),找到第一个小于x的值,两者交换; 4)、从I开始向后搜索,即由前开始向后搜索(i:=i+1),找到第一个大于x的值,两者交换; 5)、重复第3、4步,直到i=j; 例如:待排序的数组A的值分别是:(初始关键数据x:=49) A1 A2 A3 A4 A5 A6 A7: 49 38 65 97 76 13 27 进行第一次交换后: 27 38 65 97 76 13 49 ( 按照算法的第三步从后面开始找 进行第二次交换后: 27 38 49 97 76 13 65 ( 按照算法的第四步从前面开始找X的值,6549,两者交换,此时I:=3 ) 进行第三次交换后: 27 38 13 97 76 49 65 ( 按照算法的第五步将又一次执行算法的第三步从后开始找 进行第四次交换后: 27 38 13 49 76 97 65 ( 按照算法的第四步从前面开始找大于X的值,9749,两者交换,此时J:=4 ) 此时再执行第三不的时候就发现I=J,从而结束一躺快速排序,那么经过一躺快速排序之后的结果是:27 38 13 49 76 97 65,即所以大于49的数全部在49的后面,所以小于49的数全部在49的前面。 快速排序就是递归调用此过程在以49为中点分割这个数据序列,分别对前面一部分和后面一部分进行类似的快速排序,从而完成全部数据序列的快速排序,最后把此数据序列变成一个有序的序列,根据这种思想对于上述数组A的快速排序的全过程如图6所示: 初始状态 49 38 65 97 76 13 27 进行一次快速排序之后划分为 27 38 13 49 76 97 65 分别对前后两部分进行快速排序 27 结束 结束 49 65 76 49 结束 结束 利用分治思想,同样的方法继续排,直到所有数排好。程序如下:#include#includeusing namespace std;void quicksort(int a,int l,int r) int i,j,x; if(l=r) return; i=l; j=r; x=ai; while(i!=j) while(ajx&ji) j-; if(ij) ai=aj; i+; while(aii) i+; if(ij) aj=ai; j-; ai=x; quicksort(a,l,j-1); quicksort(a,i+1,r);int main() int i,a10; for(i=0;iai; quicksort(a,0,9); for(i=0;i10;i+) coutai ; system(pause); return 0;文章出处:DIY部落(/course/3_program/c+/cppjs/200832/102400.html)4、快速排序执行过程 快速排序执行的全过程可用递归树来描述。 分析: (1)递归执行的路线如图中带箭头的包络线所示。 (2) 递归树上每一结点左旁方括号表示当前待排序的区间,结点内的关键字是划分的基准关键字 注意: 叶结点对应的子区间只有一个关键字,无须划分,故叶结点内没有基准关键字(3) 划分后得到的左、右两个子区间分别标在该结点的左、右两个孩子结点的左边方括号内。【例】根结点左旁方括号49,38,65,97,76,13,27,49表示初始待排序的关键字,根内的49表示所选的划分基准记录的关键字,划分结果是27,28,134976,97,65,49_,其左右子区间分别标在根结点的两个孩子的左边。 (4) 每个分支结点右旁圆括号中的内容表示对该结点左旁区间的排序过程结束之后返回的结果。它是其左右孩子对应的区间排序完成之后,将左右孩子对应的排序结果分别放在该分支结点的关键字前后所得到的关键字序列。【例】分支结点76的左右孩子对应的区间排序后的结果分别是(49_,65)和(97),将它们分别放在76的前后即得(49,65,76,97),这是对结点76左旁区间76,97,65,49排序的结果。 (5) 算法的执行顺序是递归树中的箭头顺序,实际上当把划分操作视为访问结点的操作时,快速排序的执行过程相当于是先序遍历其递归树。 注意: 任何递归算法均可用递归树来描述其执行过程。5、快速排序各次划分后的状态变化49 38 65 97 76 13 27 49 /初始关键字27 38 13 49 76 97 65 49 /第1次划分完成之后,对应递归树第2层13 27 38 49 49 65 76 97 /对上一层各无序区划分完成后,对应递归树第3层13 27 38 49 49 65 76 97 /对上一层各无序区划分完成后,对应递归树第4层13 27 38 49 49 65 76 97 /最后的排序结果6、算法分析 快速排序的时间主要耗费在划分操作上,对长度为k的区间进行划分,共需k-1次关键字的比较。(1)最坏时间复杂度 最坏情况是每次划分选取的基准都是当前无序区中关键字最小(或最大)的记录,划分的结果是基准左边的子区间为空(或右边的子区间为空),而划分所得的另一个非空的子区间中记录数目,仅仅比划分前的无序区中记录个数减少一个。 因此,快速排序必须做n-1次划分,第i次划分开始时区间长度为n-i+1,所需的比较次数为n-i(1in-1),故总的比较次数达到最大值: Cmax = n(n-1)/2=O(n2) 如果按上面给出的划分算法,每次取当前无序区的第1个记录为基准,那么当文件的记录已按递增序(或递减序)排列时,每次划分所取的基准就是当前无序区中关键字最小(或最大)的记录,则快速排序所需的比较次数反而最多。(2) 最好时间复杂度 在最好情况下,每次划分所取的基准都是当前无序区的中值记录,划分的结果是基准的左、右两个无序子区间的长度大致相等。总的关键字比较次数: 0(nlgn)注意: 用递归树来分析最好情况下的比较次数更简单。因为每次划分后左、右子区间长度大致相等,故递归树的高度为O(lgn),而递归树每一层上各结点所对应的划分过程中所需要的关键字比较次数总和不超过n,故整个排序过程所需要的关键字比较总次数C(n)=O(nlgn)。 因为快速排序的记录移动次数不大于比较的次数,所以快速排序的最坏时间复杂度应为0(n2),最好时间复杂度为O(nlgn)。(3)基准关键字的选取 在当前无序区中选取划分的基准关键字是决定算法性能的关键。三者取中的规则 三者取中规则,即在当前区间里,将该区间首、尾和中间位置上的关键字比较,取三者之中值所对应的记录作为基准,在划分开始前将该基准记录和该区伺的第1个记录进行交换,此后的划分过程与上面所给的Partition算法完全相同。取位于low和high之间的随机数k(lowkhigh),用Rk作为基准 选取基准最好的方法是用一个随机函数产生一个取位于low和high之间的随机数k(lowkhigh),用Rk作为基准,这相当于强迫Rlow.high中的记录是随机分布的。用此方法所得到的快速排序一般称为随机的快速排序。具体算法【参见教材】注意: 随机化的快速排序与一般的快速排序算法差别很小。但随机化后,算法的性能大大地提高了,尤其是对初始有序的文件,一般不可能导致最坏情况的发生。算法的随机化不仅仅适用于快速排序,也适用于其它需要数据随机分布的算法。(4)平均时间复杂度 尽管快速排序的最坏时间为O(n2),但就平均性能而言,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 托班课程美食寿司课件
- 建筑虚拟装修平台创新创业项目商业计划书
- 油菜籽智能种植创新创业项目商业计划书
- 太空旅游虚拟体验创新创业项目商业计划书
- 强化训练人教版9年级数学上册《圆》重点解析试卷(含答案详解版)
- 招聘数据可视化分析创新创业项目商业计划书
- 黄鹤楼崔颢课件
- 2025年产品防伪行业研究报告及未来行业发展趋势预测
- 2025年对甲基苯甲酸行业研究报告及未来行业发展趋势预测
- 2025年电脑机箱电源行业研究报告及未来行业发展趋势预测
- 计算机科学实习合同模板
- 起重机械生产单位质量安全总监-特种设备考试题库
- JJF 1064-2024 坐标测量机校准规范
- 人身损害三期评定规范
- 《我与地坛》教学设计 统编版高中语文必修上册
- 《春江花月夜》省公开课金奖全国赛课一等奖微课获奖课件
- 工业固废运输处置投标方案(技术标)
- 上海市语文新初一均衡分班试卷
- 人音版小学六年级上册音乐教案(本)
- 中医培训课件:《放血疗法》
- 《福建省泰宁县》参考课件
评论
0/150
提交评论