快速排序的前后指针法相比于Hoare版和挖坑版在思路上有点不同,前后指针版的思路是引入两个指针cur和prev,在开始的时候先规定一个基准值val(一般为最右边或者最左边的那个数据),然后让两个指针指向基准值的下一个数,开始下面循环:
若cur指向的内容小于key,则prev先向后移动一位,然后交换prev和cur指向的数,然后cur++;如果cur指向的内容大于val,则cur++。
直到cur走完整个序列,此时为了让基准值在中间,只需val和prev交换单次排序就完成了。下面是单次排序的动图:

在循环的过程中整个除了基准值的序列被prev和cur分成三个部分(拿升序举例):
(from, prev) :这是这个区间的数都是小于等于基准值的;
[s, i):这个区间都是大于基准值的
[i, to]: 是还没有被比较过的

下面是代码:

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);//处理左子序列quickSortRange(array, from, index - 1);//处理右子序列quickSortRange(array, index + 1, to);}
public static int partition(int[] array, int from, int to){int val = array[from];int s = from + 1;for (int i = from + 1; i <= to; i++){if (array[i] < val){swap(array, i, s);s++;}}swap(array, from, s - 1);return s - 1;}

快速排序思路(前后指针版),代码实现相关推荐

  1. 快速排序思路(挖坑版),代码实现

    挖坑版是在Hoare版的基础上做了改造,答题思路还是和Hoare版一样. 挖坑版partition单次过程: 选一个基准值,一般选最左或者最右面,把该基准值存在val变量中,因为值存到了变量里,所以可 ...

  2. 快速排序思路(Hoare版),代码实现

    快速排序是一种相对比较快的排序,它的思想为: 选取待排序元素序列中的一个元素作为基准值,然后(以升序为例)比基准值小的元素放在基准值左边,比基准值大的元素放在基准值右边,这样的话,原先待排序序列就被分 ...

  3. 【Python】《大话设计模式》Python版代码实现

    <大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼 ...

  4. 网易云信,发送验证码短信C#版代码

    网易云信,发送验证码短信C#版代码 网易云信发送短信代码(C# 版)....需要注意SHA1 String有转换小写!!!! using System; using System.Collection ...

  5. 用母函数的思路解释母函数的代码

    该文章建立在你已经看过母函数的相关数学知识的基础上,如果没有看过,建议看一下 hdu 论坛的母函数课件,传送门:http://acm.hdu.edu.cn/forum/read.php?tid=385 ...

  6. 存根类 测试代码 java_有关为旧版代码创建存根的更多信息–测试技术7

    存根类 测试代码 java 在我的上一个博客中 ,我谈到了如何处理行为不佳的不可测试的 (1) SitePropertiesManager 类,以及如何通过提取接口来创建存根. 但是,如果由于旧类的源 ...

  7. 存根类 测试代码 java_为旧版代码创建存根-测试技术6

    存根类 测试代码 java 任何阅读此博客的人都可能已经意识到,目前我正在开发一个项目,其中包含大量的旧代码,这些旧代码庞大,扩展且编写时从未进行过任何测试. 在使用此遗留代码时,有一个行为非常差的类 ...

  8. 为旧版代码创建存根–测试技术6

    任何阅读此博客的人都可能已经意识到,目前我正在开发一个包含大量旧代码的项目,这些旧代码庞大,扩展且编写时从未进行过任何测试. 在使用此遗留代码时,有一个行为异常的类非常普遍,整个团队都一次又一次地犯错 ...

  9. 有关为旧版代码创建存根的更多信息–测试技术7

    在上一个博客中 ,我谈到了如何处理行为不佳的不可测试的 (1) SitePropertiesManager 类,以及如何通过提取接口来创建存根. 但是,如果由于旧类的源代码已被锁定在第三方JAR文件中 ...

最新文章

  1. 编写优质代码的 6 大关键方法
  2. linux18.04安装显卡驱动,详细介绍ubuntu18.04安装NVIDIA显卡驱动(亲测有效!)
  3. Mac OS build caffe2 Error:This file was generated by an older version of protoc which is
  4. boost::convert模块实现算法的测试程序
  5. 使用Container.ItemIndex获取Repeater、Gridview行的序号的简单方法
  6. Java多线程系列——深入重入锁ReentrantLock
  7. 3、java中的数据类型和运算符
  8. HDFS上传文件命令报错org.apache.hadoop.ipc.RemoteException(java.io.IOException)
  9. cmd窗口使用python提示“Python not found”,可能是环境变量配置的原因
  10. python冒泡排序原理_如何实现python冒泡排序算法?
  11. 单片机声明数组可变长度c语言keil,单片机用byte定义数组keil编译警告 missing';'before...
  12. Android 源码分析(三) Service 启动分析
  13. android 在指定位置添加布局,Android 如何动态添加 View 并显示在指定位置。
  14. 【小月电子】ALTERA FPGA开发板系统学习教程-LESSON5数码管动态显示
  15. android简易播放器2:activity和service同步显示
  16. 程序员常用的网站合集
  17. 大数据分析与实践 数据预处理-主成分分析
  18. 菜鸟说有线网络连接故障
  19. 玩笑程序“疯”字病毒 感染.exe 专杀方案
  20. oracle常用函数之trim( )、ltrim( )、rtrim( )

热门文章

  1. 多台电脑共享一套鼠标键盘的免费方法
  2. Python 列表 count( )方法
  3. 有关cookie实现统计pv,uv的一些用法
  4. 使用【Linux操作系统】必须掌握的基本命令
  5. 机器学习中的数学(一)--基础数学与基本微分学
  6. C++ 虚函数重载多态
  7. 通过串口打印--超声波测距模块测得距离
  8. 单调栈解木板倒水问题
  9. 11 | 互联网产品的测试策略应该如何设计?
  10. vs2010调试-尝试调试dll源码。