快速排序基本思想超详细一看就懂.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
快速排序基本思想超详细一看就懂 快速排序算法是一种非常高效的排序算法,它采用“分而治之”的思想,将大的拆分为小的,小的拆分为更小的。 如果说,希尔排序是直接插入排序的升级(插入类),堆排序是简单选择排序的升级(选择类),那么快速排序等于前面我们认为最慢的冒泡排序的升级(交换类)。 快速排序算法是图灵获奖者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次枢轴挑选,得到枢轴元素下标=1 3、根据第1次枢轴挑选结果,进行递归处理 4、递归1:左边数组 5、递归1:右边数组 6、进行第2次枢轴挑选,得到枢轴元素下标=3 7、根据第2次枢轴挑选结果,进行递归处理 8、递归2:右边数组 9、递归2:左边数组 10、进行第3次枢轴挑选,得到枢轴元素下标=5 11、此时,我们完成对数组的快速排序,得到顺序数组输出:[1, 2, 5, 7, 8, 9] 快速排序算法之双指针遍历实现代码 下面是快速排序的算法实现: public class QuickSort { public static void main(String[] args) { int[] array = {2, 1, 7, 9, 5, 8}; QSort(array, 0, 5); System.out.println(Arrays.toString(array)); } private static void QSort(int[] nums, int low, int high){ int pivot; 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、选取枢轴策略就是元素的中位数的下标。 */ private static int partition(int[] nums, int low, int high) { int pivotKey = nums[low]; while (low high){ while (low high nums[high] = pivotKey){ //find out the element which is smaller then

文档评论(0)

136****9085 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档