版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
快速排序基本思想超详细一看就懂快速排序算法是一种非常高效的排序算法,它采用“分而治之”的思想,将大的拆分为小的,小的拆分为更小的。如果说,希尔排序是直接插入排序的升级(插入类),堆排序是简单选择排序的升级(选择类),那么快速排序等于前面我们认为最慢的冒泡排序的升级(交换类)。快速排序算法是图灵获奖者Tony
Hoare
设计出来的,他在形式化方法理论以及ALGOL60编程语言发明中有卓越的贡献,是上世纪最伟大的计算机科学家之一。而快速排序算法只是他众多贡献中的一个小发明而已。其原理如下:对于一组给定的记录,通过一趟排序后,将原序列分为两部分,其中前一部分的记录均比后一部分的所有记录小(有序);然后再依次对前后两部分的记录进行快速排序,递归该过程,直到序列的所有记录均有序为止。图解快排算法思想结合图例,快速排序的算法步骤大致如下:1、我们有一个数组:[2,1,7,9,5,8]2、分割1:按照快速排序的思想,首先把数组筛选成较小和较大的两个子数组。选择基准值7,将原数组分割为两个子数组:[2,1,5]和[7,9,8]3、分割2:针对两个子数组:[2,1,5]和[7,9,8],在较小的子数组里选2作为基准值,在较大的子数组里选8作为基准值,继续分割子数组。基准值2,[2,1,5]分割为:[1]和[2,5]基准值8,[9,8]分割为:[8]和[9]4、分割3:继续将元素个数大于1的子数组进行划分,当所有子数组里的元素个数都为1的时候,原始数组也被排好序了。基准值2,[2,5]分割为:[2]和[5]基准值8,[9,8]分割为:[8]和[9]5、分割结果,所有子数组的元素个数都为1,得到结果数组:我们从上面可以总结出规律,在实行分治过程中,如何选择基准值并拆分数组是难点。拆分算法是整个快速排序中的核心,快速排序拥有非常多的拆分方式,其中广泛使用的是单指针遍历法与双指针遍历法。篇幅所限,我们这里对面试常常问的双指针遍历算法进行图解剖析。快速排序算法之双指针遍历实现图解快速排序算法之双指针遍历实现图解:1、首先,我们得到一个初始数组:[2,1,7,9,5,8]2、进行第1次枢轴挑选,得到枢轴元素下标=13、根据第1次枢轴挑选结果,进行递归处理4、递归1:左边数组5、递归1:右边数组6、进行第2次枢轴挑选,得到枢轴元素下标=37、根据第2次枢轴挑选结果,进行递归处理8、递归2:右边数组9、递归2:左边数组10、进行第3次枢轴挑选,得到枢轴元素下标=511、此时,我们完成对数组的快速排序,得到顺序数组输出:[1,2,5,7,8,9]快速排序算法之双指针遍历实现代码下面是快速排序的算法实现:publicclassQuickSort{publicstaticvoidmain(String[]args){int[]array={2,1,7,9,5,8};QSort(array,0,5);System.out.println(Arrays.toString(array));}
privatestaticvoidQSort(int[]nums,intlow,inthigh){intpivot;if(low>=high){return;}//难点也是核心,partition函数工作内容:选取某个中枢元素(枢轴,pivot),然后想办法将它放到某一位置,//使得它左边的值都小于它,右边的值都大于它。pivot=partition(nums,low,high);//分解为更小的问题,递归QSort(nums,low,pivot-1);QSort(nums,pivot+1,high);}
/***<p>*1、交换顺序表nums的记录,使得枢轴到位,并返回所在位置*2、确保枢轴左边元素<枢轴,枢轴右边元素>枢轴*3、选取枢轴策略就是元素的中位数的下标。*/privatestaticintpartition(int[]nums,intlow,inthigh){intpivotKey=nums[low];while(low<high){while(low<high&&nums[high]>=pivotKey){//findouttheelementwhichissmallerthenpivotKeyhigh--;}
//一次遍历,找到比基准值更小的元素并排序到前面swap(nums,low,high);while(low<high&&nums[low]<=pivotKey){//findouttheelementwhichisbiggerthenpivotKeylow++;}
//一次遍历,找到比基准值更大的元素并排序到后面swap(nums,low,high);}returnlow;}
staticvoidswap(int[]nums,inti,intj){inttmp=nums[i];nums[i]=nums[j];nums[j]=tmp;}}输出:[1,2,5,7,8,9]快排复杂度分析我们来分析下快速排序算法的性能:快速排序的时间复杂度取决于快速排序递归的深度,在最优情况下,快速排序算法的时间复杂度为O(nlogn)。在最坏情况下,待排序序列为正序或者逆序,每次划分只得到一个比上次少一个记录的子序列(另一个为空),最终时间复杂度为O(n^2)。由数学归纳法,其数量级为O(nlogn)。快速排序的空间复杂度主要是递归造成的栈空间的使用,最好情况,递归树的深度为logn,那么它的空间复杂度也是O(logn)。最坏情况,要进行n-1次递归调用,那么空间复杂度就是O(n)。平均情况,空间复杂度为O(logn)。由于关键字的比较和交换是跳跃进行的,因此快速排序是不稳定的排序方法。总结
递归排序算法,还是有不少值得优化的地方:1、优化选取枢轴:采用三数取中法(median-of-three),即取是哪个关键字先进行排序,将中间数作为枢轴,一般使用左端、右端和中间三个数,或者随机选取。或者采用九数取中(medina-of-nine),从数组中三次取样每次三个,基于样品取中数,然后从三个中数再取中数作为枢轴。2、优化不必要的交换3、优化小数组时的排序方案如果
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 国盛证券2026年度校园招聘备考题库及答案详解一套
- 2026年福建省农业科学院植物保护研究所公开招聘科研助理的备考题库有答案详解
- 2026年贵阳市观山湖区第七中学秋招临聘教师备考题库及参考答案详解
- 六盘水市青少年活动中心2026年第一批公开招聘外聘教师备考题库(含答案详解)
- 初中生艺术展览活动策划与实施对学生创新思维的影响教学研究课题报告
- 2026年备考题库技术中心招聘备考题库及答案详解(夺冠系列)
- 宁德人民医院2025年编外人员招聘备考题库(七)及参考答案详解一套
- 天津市卫生健康委员会所属天津医学高等专科学校2026年度公开招聘11人备考题库完整参考答案详解
- 江铜宏源铜业有限公司2026年度第二批次社会招聘备考题库及参考答案详解一套
- 中小学STEM教育数字资源整合与教师培训体系构建研究教学研究课题报告
- 清华大学《工程伦理》网课习题及期末考试答案
- 个人借款合同个人借款协议
- 生物科技股份有限公司GMP质量手册(完整版)资料
- 2023年运动康复期末复习-体适能理论与训练(运动康复专业)考试上岸题库历年考点含答案
- 中国纪录片发展历程
- 2023年德语专业四级考试真题
- 班组工程进度款申请表
- 四年级阅读训练概括文章主要内容(完美)
- JJG 1033-2007电磁流量计
- GB/T 6541-1986石油产品油对水界面张力测定法(圆环法)
- GB/T 2895-2008塑料聚酯树脂部分酸值和总酸值的测定
评论
0/150
提交评论