快速排序思路(Hoare版),代码实现
快速排序是一种相对比较快的排序,它的思想为:
选取待排序元素序列中的一个元素作为基准值,然后(以升序为例)比基准值小的元素放在基准值左边,比基准值大的元素放在基准值右边,这样的话,原先待排序序列就被分为了左子序列,右子序列,基准值,三个部分,,然后把左子序列看做新的待排序序列进行上述操作,左子序列又被分为新的左右子序列(递归的思想),当左子序列处理完之后再去处理右子序列,最后着呢个待排序序列就有序了。
下面是动图演示过程:
public static void quickSort(int[] array){//把基准值选在待排序序列的最左边,第一次就是 0 的位置。quickSortRange(array, 0, array.length - 1);}private static void quickSortRange(int[] array, int from, int to) {int size = to - from + 1;//递归结束条件if (size <= 1)return;//先处理传入序列,返回值为一次单趟排序之后的基准值的位置,//基准值左边为左子序列,基准值右边为右子序列int index = partition(array, from, to);//处理左子序列partition(array, from, index - 1);//处理右子序列partition(array, index + 1, to);}/*这是一次单趟排序:1、选出一个key,一般是最左边或是最右边的。2、定义一个L和一个R,L从左向右走,R从右向左走。(需要注意的是:若选择最左边的数据作为key,则需要R先走;若选择最右边的数据作为key,则需要L先走)。3、在走的过程中,若R遇到小于key的数,则停下,L开始走,直到L遇到一个大于key的数时,将L和R的内容交换,R再次开始走,如此进行下去,直到L和R最终相遇,此时将相遇点的内容与key交换即可。(选取最左边的值作为key)经过一次单趟排序,最终使得key左边的数据全部都小于key,key右边的数据全部都大于key。*/private static int partition(int[] array, int from, int to) {int left = from;int right = to;int key = array[from];while (left < right){while (array[right] >= key && right > left)right--;while (array[left] <= key && right > left)left++;swap(array, left, right);}//走到这里说明 left == right了,//让基准值到中间,方便后续处理左子序列swap(array, from, left);return left;}
快速排序思路(Hoare版),代码实现相关推荐
- 快速排序思路(前后指针版),代码实现
快速排序的前后指针法相比于Hoare版和挖坑版在思路上有点不同,前后指针版的思路是引入两个指针cur和prev,在开始的时候先规定一个基准值val(一般为最右边或者最左边的那个数据),然后让两个指针指 ...
- 快速排序思路(挖坑版),代码实现
挖坑版是在Hoare版的基础上做了改造,答题思路还是和Hoare版一样. 挖坑版partition单次过程: 选一个基准值,一般选最左或者最右面,把该基准值存在val变量中,因为值存到了变量里,所以可 ...
- 【数据结构与算法】高级排序(希尔排序、归并排序、快速排序)完整思路,并用代码封装排序函数
本系列文章[数据结构与算法]所有完整代码已上传 github,想要完整代码的小伙伴可以直接去那获取,可以的话欢迎点个Star哦~下面放上跳转链接 https://github.com/Lpyexplo ...
- 《大厂算法面试题目与答案汇总,剑指offer等常考算法题思路,python代码》V1.0版...
为了进入大厂,我想很多人都会去牛客.知乎.CSDN等平台去查看面经,了解各个大厂在问技术问题的时候都会问些什么样的问题. 在看了几十上百篇面经之后,我将算法工程师的各种类型最常问到的问题都整理了出来, ...
- PTA 统计工龄 思路分析及代码解析
PTA 统计工龄 思路分析及代码解析v0.6 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析 三.具体实现 1. ...
- 【Python】《大话设计模式》Python版代码实现
<大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼 ...
- ML之LGBMRegressor(Competition):2018年全国大学生计算机技能应用大赛《住房月租金预测大数据赛》——设计思路以及核心代码—191017再次更新
ML之LGBMRegressor(Competition):2018年全国大学生计算机技能应用大赛<住房月租金预测大数据赛>--设计思路以及核心代码-191017再次更新 目录 竞赛相关信 ...
- 网易云信,发送验证码短信C#版代码
网易云信,发送验证码短信C#版代码 网易云信发送短信代码(C# 版)....需要注意SHA1 String有转换小写!!!! using System; using System.Collection ...
- 存根类 测试代码 java_有关为旧版代码创建存根的更多信息–测试技术7
存根类 测试代码 java 在我的上一个博客中 ,我谈到了如何处理行为不佳的不可测试的 (1) SitePropertiesManager 类,以及如何通过提取接口来创建存根. 但是,如果由于旧类的源 ...
- 存根类 测试代码 java_为旧版代码创建存根-测试技术6
存根类 测试代码 java 任何阅读此博客的人都可能已经意识到,目前我正在开发一个项目,其中包含大量的旧代码,这些旧代码庞大,扩展且编写时从未进行过任何测试. 在使用此遗留代码时,有一个行为非常差的类 ...
最新文章
- 满足极高读写性能需求的Key-Value数据库
- python 错误 SSLError: [SSL: SSLV3_ALERT_BAD_RECORD_MAC] sslv3 alert bad record mac (_ssl.c:1864) 解决方法
- 学机械可以转计算机吗,本人合工大车辆工程大一新生,但是机械类前景都不太好,我要不要转计算机,求教?...
- XLSReadWriteII 4.00.62 XE2 可以使用
- 子网掩码及网络号路由表的匹配方法
- 【转】Linux下的多线程编程背景知识
- MySQL学习-排序与分组函数
- Windows Gadget 制作二
- php获取ajax data,HTML 获取 PHP 接口数据(ajax)
- break and continue;
- java中说明书/开发文档如何编写?
- 如何下载高程地图并处理
- java在哪里报错_BirthDate.java程序错误在哪里运行不出来写着 c :myjavajavac Test.java Test.java:46 找不到符号 符号...
- 目前最新全国行政区域JSON数据截止2015年9月30日
- php中subtr()函数的使用方法
- Oracle 手工锁表
- Vue过滤器的介绍和使用
- 经济学知识——LPR、MLF、SLF、SLO、PSL、OMO
- matlab求椭圆的弧长,用MATLAB实现求椭球上任意两点的最短弧长
- http://blog.csdn.net/heli007/article/details/7279022
热门文章
- nQueen问题java实现
- [Node.js] 模块化 -- 中间件和跨域
- 前端都应懂的入门基础-github基础
- 最新基于adt-bundle-windows-x86的android开发环境搭建
- C++ 用new 动态创建多维数组
- OpenCV3学习(12.4) 粒子滤波Condensation算法
- Java数组去重的多种方法,[Java教程]JavaScript常见的五种数组去重的方式
- python template languages_Python template.TemplateSyntaxError方法代碼示例
- 关于idea Tomcat部署的一个小坑
- Android开发 GradientDrawable详解