一、快速排序算法描述

基本思想:

1.每一轮排序选择一个基准点(pivot)进行分区

1.让小于基准点的元素的进入一个分区,大于基准点的元素的进入另一个分区

2.当分区完成时,基准点元素的位置就是其最终位置

2.在子分区内重复以上过程,直至子分区元素个数少于等于 1,这体现的是分而治之的思想 (divide-and-conquer)

不同的版本:

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

①选择最右元素作为基准点元素

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

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

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

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

①选择最左元素作为基准点元素

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

③最后基准点与 i(此时 i 与 j 相等)交换,i 即为分区位置

3.双边循环几个要点

1.基准点在左边,并且要先 j 后 i

2.while( i < j  && a[j] > pv ) j--

3.while ( i < j  && a[i] <=  pv ) i++

二、单边快排图形演示

1、选择4为基准点,i>j,ij交换,然后i前进

2、25交换

3、17交换

4、pv和i交换

5、最后递归遍历左半边和右半边元素,最终排序完成

三、单边快排的代码

import java.util.Arrays;// 单边循环法 (lomuto)
public class QuickSort1 {public static void main(String[] args) {int[] a = {5, 3, 7, 2, 9, 8, 1, 4};System.out.println(Arrays.toString(a));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); // p 索引值quick(a, l, p - 1); // 左边分区的范围确定quick(a, p + 1, h); // 左边分区的范围确定}private 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;}
}

四、双边循环图形演示

1、选取左边为基准点,j往左找比基准点小的,i往右找比基准点大的,两者交换

2、19交换

3、左右分区分好,基准点元素和中间元素交换

4、左区间和右区间递归即可完整排序

五、双边循环代码

import java.util.Arrays;
// 双边循环法
public class QuickSort2 {public static void main(String[] args) {int[] a = {5, 3, 7, 2, 9, 8, 1, 4};System.out.println(Arrays.toString(a));quick(a, 0, a.length - 1);}private 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);}private 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) {//i必须小于j,不然i可能往前走,停不下来j--;}// i 从左找大的while (i < j && a[i] <= pv) {//i一开始指向pv,故必须要=号i++;}swap(a, i, j);}swap(a, l, j);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.平均时间复杂度是 Onlog2nO(n log_2⁡n ),最坏时间复杂度 O

基础算法——快速排序详细讲解相关推荐

  1. 快速排序(详细讲解)

    如今的面试里面,快速排序成了一项必须要掌握的技能,面试官考快排的概率非常大,不管是从思路上还是实践上,都基本必问.快速排序是一个既高效又不浪费空间的一种排序算法.下面来详细讲解一番快速排序: 假设我们 ...

  2. 算法题Nuts and Bolts(螺母螺钉)快速排序详细讲解(含流程图)

    1. 思路 首先选择螺丝中的一个元素作为pivot,用螺丝把螺母分区,每次分区得到三个结果, A1,完全匹配的一对 A2,比螺丝小的螺母 A3,比螺丝大的螺母 将1中的螺母取出,用它对螺丝进行分区,可 ...

  3. k均值算法原理详细讲解以及matlab代码实现

    有研究生物电信号处理和机器学习的欢迎加我qq429500506共同交流学习进步. 最近更新文章的频率太低了,主要原因是不想为了发文章而发文章,想潜心研究,写好文章,顺便想说一句开源万岁,最近一个月虽然 ...

  4. Python爬虫基础教程,详细讲解(含爬取文字为乱码解决办法、反爬虫机制解决办法)

    Python爬虫学习笔记 前言 适当爬取怡情,过度爬取- ** 爬取到的东西不要商用!爬取到的东西不要商用!爬取到的东西不要商用! 1.准备工具 获取Python request第三方库 方法一:同时 ...

  5. manacher 算法 java,Manacher算法的详细讲解

    Manacher算法,又叫"马拉车"算法,可以在时间复杂度为O(n)的情况下求解一个字符串的最长回文子串长度的问题. 一.回文子串的一般解法 比较简单的思路是将字符串的每一个字符作 ...

  6. spring boot整合freemarker及freemarker基础语法超详细讲解

    采用模板+数据=HTML 实现页面的静态化. 也就是服务端的页面静态化技术. JSP/Freemarker/Thymeleaf是常见的模板引擎. 引依赖 okhttp与HttpClient一样的作用, ...

  7. python 网络框架twisted基础学习及详细讲解

    twisted网络框架的三个基础模块:Protocol, ProtocolFactory, Transport.这三个模块是构成twisted服务器端与客户端程序的基本. Protocol:Proto ...

  8. 信息学奥赛一本通1336:寻找树根和孩子(图论算法-树)详细讲解

    题目 信息学奥赛一本通(C++版)在线评测系统 思路讲解 首先我们可以看到这到题数据量不大,可以直接简单粗暴用邻接矩阵来存,用题目中的数据,邻接矩阵存储如下: 1 2 3 4 5 6 7 8 1 1 ...

  9. HyperLogLog 使用及其算法原理详细讲解

    本文已收录于专栏 ❤️<Redis之大厂必备技能包>❤️ 欢迎各位关注.三连博主的文章及专栏,全套Redis学习资料,大厂必备技能! 目录 一.简介 二.命令 2.1 PFADD key ...

最新文章

  1. 深度学习多变量时间序列预测:卷积神经网络(CNN)算法构建时间序列多变量模型预测交通流量+代码实战
  2. strrchr php,php strstr() strrchr() strpos() strrpos()函数_PHP教程
  3. 双层循环嵌套打印矩形 java
  4. 一个关于文件结构体数组的条件排序函数
  5. 零信任能力成熟度模型白皮书发布!内附下载资源
  6. Linux下SVN客户端使用教程(全)
  7. 心海软件学心理测试系统,心海软件-心理测试、心理档案、心理咨询室管理系统...
  8. 海思芯片怎么使用tde给qt加速_海思芯片怎么让华为手机走到射频芯片国产化之路的?...
  9. autoucad2014激活就未响应_CAD2014激活错误怎么办,autocad2014激活错误的解决办法
  10. 设置计算机屏幕保护程序,电脑屏保怎么设置?一键设置电脑屏幕保护方法
  11. 立体匹配(Stereo Matching)
  12. 优质的石材 石头VRay材质球素材推荐,不容错过
  13. MySQL中更新时间字段的更新时点问题
  14. 计算机国考报哪些岗位,国考职位有哪些
  15. 单身社会如何生活-日本纪录片ガイアの夜明け系列
  16. 前后端交互ajax和axios入门讲解,以及http与服务器基础
  17. 通过DOS 将FAT32转为NTFS,NTFS转FAT32
  18. Master of Typing in Chinese Mac中文打字大师
  19. c语言 计步算法,基于51单片机的计步器设计
  20. 南非世界杯 小组赛 巴西vs葡萄牙

热门文章

  1. MMSE信道估计学习笔记
  2. (四)Python反爬实战---JS反爬之某网站portal-sign验证参数加密
  3. 高传染性传染病的传播趋势预测
  4. 代价函数(损失函数)
  5. Iris:医疗行业的区块链解决方案
  6. 测试小兵成长记:当家方知油盐贵
  7. 互联网最大规模的裁员降薪要来了?
  8. 43256rtfdd
  9. [经验] 4K HDMI 接收发送 FMC子板(图像处理LVDS to HDMI 转换立体声双通道 )
  10. 【Redis源代码剖析】 - Redis内置数据结构之压缩字典zipmap