单边循环快排(lomuto 洛穆托分区方案 )

  1. 选择最右元素作为基准点元素

  2. j 指针负责找到比基准点小的元素,一旦找到则与 i 进行交换

  3. i 指针维护小于基准点元素的边界,也是每次交换的目标索引

  4. 最后基准点与 i 交换,i 即为分区位置

 public static void main(String[] args) {int[] a = {5, 3, 7, 2, 9, 8, 1, 4};quick(a, 0, a.length-1);}public static void  quick(int[] a, int l, int h) {if (l >= h) {return;}int p = partition(a, l, h);quick(a, l, p-1);quick(a, p+1, h);}public static int partition(int[] a, int l, int h) {int pv = a[h]; // 基准点元素int i = l;for(int j = l; j < h; j++) {if (a[j] < pv) {if (i != j) {swap (a, i , j);}i++;}}if (i != h) {swap (a, h, i);}System.out.println(Arrays.toString(a)+ "i=" + i);// 返回值代表了基准点元素的正确索引,用它确定下一轮分区的边界return i;}public static void swap(int[] a, int i, int j) {int t = a[i];a[i] = a[j];a[j] = t;}

 双边循环快排(不完全等价于hoare 霍尔分区方案)

1.选择最左元素作为基准点元素

2.j指针负责从右到左找比基准点小的元素,i指针负责从左到右找比基准点大的元素,一旦找到,二者交换,直到i=j

3.最后基准点要与i(此时i,j 相交)交换元素,i即为分区位置

注意:基准点元素在最左边  ,在循环时一定要保证 j >i

 public static void main(String[] args) {int[] a = {5, 3, 7, 2, 9, 8, 1, 4};quick(a, 0, a.length-1);}public static void  quick(int[] a, int l, int h) {if (l >= h) {return;}int p = partition(a, l, h);quick(a, l, p-1);quick(a, p+1, h);}public static int partition(int[] a, int l, int h) {int pv = a[l];int i = l;int j = h;while (i < j) {// j 从右找小的while (i < j && a[j] > pv) {j--;}// i 从左找大的while (i < j && a[i] <= pv) {i++;}if(i != j) {swap(a,i,j);}}swap(a,l,i);System.out.println(Arrays.toString(a)+ "j=" +j);return j;}public static void swap(int[] a, int i, int j) {int t = a[i];a[i] = a[j];a[j] = t;}

单边、双边循环快速排序相关推荐

  1. 【C】双边循环快速排序,升序和降序的区别

    框架 数组内有很多0元素,通常没有问题,但是我项目中出现要排序的是保存结构体指针的链表元素,其中可能有空元素,明明有节点,但是没有数据的情况. 这种情况有时应该放开头,有时放结尾,有时直接删除掉(也许 ...

  2. 快速排序的实现(单边循环、双边循环、非递归的实现)

    文章目录 前言 双边循环法 思路梳理 代码展示 总结 单边循环法 思路梳理 代码展示 非递归的实现 思路梳理 代码展示 总结 前言 上一篇文章讲解了冒泡排序的优化,现在来总结一下快速排序.快速排序作为 ...

  3. 算法整理(二)---快速排序的两种实现方式:双边扫描和单边扫描

    首先简单谈下快速排序的特点,时间复杂度O(nLog n),最差时间复杂度O(n^2),平均时间O(nLog n).因为用到了函数栈,空间复杂度为O(lg n),最差为O(n).是一种不稳定的排序方法. ...

  4. JAVA快速排序递归算法

    快速排序 分为双边循环法和单边循环法,先来双边循环法,双边循环法是使用双指针,首先,选定基准元素pivot,并且设置两个指针left和right,指向数列的最左和最右两个元素.接下来进行第1次循环,从 ...

  5. 基础算法——快速排序详细讲解

    一.快速排序算法描述 基本思想: 1.每一轮排序选择一个基准点(pivot)进行分区 1.让小于基准点的元素的进入一个分区,大于基准点的元素的进入另一个分区 2.当分区完成时,基准点元素的位置就是其最 ...

  6. Java基础——递归实现归并排序和快速排序

    每日正能量 智者的梦再美,也不如愚人实干的脚印. 递归 1.什么是递归 递归,就是在运行的过程中调用自己. 构成递归需具备的条件: 子问题须与原始问题为同样的事,且更为简单: 不能无限制地调用本身,须 ...

  7. java小白探索,螺栓螺母匹配,冒泡实现和快速排序实现

    丁丁的算法作业,学大佬发博客,各位大佬教教我算法入门求求了.昨天大佬指出冒泡哪里有错误已经修改了,在源代码上加上了键入. package com.company;import java.util.Ar ...

  8. 算法专题(一)1.1 希尔排序,快速排序

    对于我们这个算法,要明确算法实现函数的参数,明确了参数,知道要对什么做操作,将使得你的思路和题解豁然开朗. 所以针对一些普遍的情况,我们设想要对自己的样本的集合,以及样本长度做好规划,也即做了参数. ...

  9. 《啊哈!算法》第一章 - 第三节 - 快速排序(Java实现)

    <啊哈!算法>第一章 - 第三节 - 快速排序(Java实现) 快速排序 升序排序 降序排序 快速排序 举个例子: 对 6 1 2 7 9 3 4 5 10 8 这 10 个数进行排序 首 ...

最新文章

  1. Linux下日志文件过大解决方案
  2. Discovery studio画蛋白质构象叠合图
  3. 小白如何购买阿里云服务器(图文教程)?
  4. SteamVR追踪技术有多火? 半数开发者来自非游戏行业
  5. python开三次方_python实现三次样条插值
  6. access 如何使用dolby_Access/VBA/Excel-Access表及字段创建-03
  7. 外设驱动库开发笔记16:MS5536C压力变送器驱动
  8. iOS内存管理系列之一:对象所有权与引用计数
  9. 项目中的一个技术方案替换历程(surfaceview+fragment 变成悬浮窗window)
  10. form data怎么接收_VUE发送Formdata数据,NodeJS接收
  11. atitit.vod search doc.doc 点播系统搜索功能设计文档
  12. 有一种爱情,叫沉、重!
  13. java屠龙_倚天屠龙之江湖神器
  14. 2019/12/9 K60单片机学习
  15. 【Rocksdb实现分析及优化】事务之Pessimistic ①
  16. 自动聚焦技术(AF)
  17. XUPT—ACM周总
  18. 模型上线和pmml简介
  19. 在Linux命令行中使用tcpdump的简介
  20. Qt新手入门指南 - 如何创建模型/视图(四)

热门文章

  1. 深搜广搜专题【DFS】【BFS】
  2. OPENCV之寻找并绘制轮廓以及提取轮廓重心坐标
  3. Kaggle(L3) - Stochastic Gradient Descent Notebook
  4. 软考 软件设计师 下午题-试题三 历年真题
  5. 紫金桥软件与和利时PLC Modbus连接
  6. win10自带输入法在切换中英文的过程中,出现了输入字符所占间距变大的问题
  7. 新海gsp医药管理系统 v3.3 怎么用
  8. iOS微信授权登录集成
  9. 教你如何秒杀12306,JAVA程序抢票成功 分享 附截图
  10. 真香...全网最牛12306抢票神器,GitHub热榜第一,标星1.3W!