基础算法——快速排序详细讲解
一、快速排序算法描述
基本思想:
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;}
}
六、快速排序特点
基础算法——快速排序详细讲解相关推荐
- 快速排序(详细讲解)
如今的面试里面,快速排序成了一项必须要掌握的技能,面试官考快排的概率非常大,不管是从思路上还是实践上,都基本必问.快速排序是一个既高效又不浪费空间的一种排序算法.下面来详细讲解一番快速排序: 假设我们 ...
- 算法题Nuts and Bolts(螺母螺钉)快速排序详细讲解(含流程图)
1. 思路 首先选择螺丝中的一个元素作为pivot,用螺丝把螺母分区,每次分区得到三个结果, A1,完全匹配的一对 A2,比螺丝小的螺母 A3,比螺丝大的螺母 将1中的螺母取出,用它对螺丝进行分区,可 ...
- k均值算法原理详细讲解以及matlab代码实现
有研究生物电信号处理和机器学习的欢迎加我qq429500506共同交流学习进步. 最近更新文章的频率太低了,主要原因是不想为了发文章而发文章,想潜心研究,写好文章,顺便想说一句开源万岁,最近一个月虽然 ...
- Python爬虫基础教程,详细讲解(含爬取文字为乱码解决办法、反爬虫机制解决办法)
Python爬虫学习笔记 前言 适当爬取怡情,过度爬取- ** 爬取到的东西不要商用!爬取到的东西不要商用!爬取到的东西不要商用! 1.准备工具 获取Python request第三方库 方法一:同时 ...
- manacher 算法 java,Manacher算法的详细讲解
Manacher算法,又叫"马拉车"算法,可以在时间复杂度为O(n)的情况下求解一个字符串的最长回文子串长度的问题. 一.回文子串的一般解法 比较简单的思路是将字符串的每一个字符作 ...
- spring boot整合freemarker及freemarker基础语法超详细讲解
采用模板+数据=HTML 实现页面的静态化. 也就是服务端的页面静态化技术. JSP/Freemarker/Thymeleaf是常见的模板引擎. 引依赖 okhttp与HttpClient一样的作用, ...
- python 网络框架twisted基础学习及详细讲解
twisted网络框架的三个基础模块:Protocol, ProtocolFactory, Transport.这三个模块是构成twisted服务器端与客户端程序的基本. Protocol:Proto ...
- 信息学奥赛一本通1336:寻找树根和孩子(图论算法-树)详细讲解
题目 信息学奥赛一本通(C++版)在线评测系统 思路讲解 首先我们可以看到这到题数据量不大,可以直接简单粗暴用邻接矩阵来存,用题目中的数据,邻接矩阵存储如下: 1 2 3 4 5 6 7 8 1 1 ...
- HyperLogLog 使用及其算法原理详细讲解
本文已收录于专栏 ❤️<Redis之大厂必备技能包>❤️ 欢迎各位关注.三连博主的文章及专栏,全套Redis学习资料,大厂必备技能! 目录 一.简介 二.命令 2.1 PFADD key ...
最新文章
- 深度学习多变量时间序列预测:卷积神经网络(CNN)算法构建时间序列多变量模型预测交通流量+代码实战
- strrchr php,php strstr() strrchr() strpos() strrpos()函数_PHP教程
- 双层循环嵌套打印矩形 java
- 一个关于文件结构体数组的条件排序函数
- 零信任能力成熟度模型白皮书发布!内附下载资源
- Linux下SVN客户端使用教程(全)
- 心海软件学心理测试系统,心海软件-心理测试、心理档案、心理咨询室管理系统...
- 海思芯片怎么使用tde给qt加速_海思芯片怎么让华为手机走到射频芯片国产化之路的?...
- autoucad2014激活就未响应_CAD2014激活错误怎么办,autocad2014激活错误的解决办法
- 设置计算机屏幕保护程序,电脑屏保怎么设置?一键设置电脑屏幕保护方法
- 立体匹配(Stereo Matching)
- 优质的石材 石头VRay材质球素材推荐,不容错过
- MySQL中更新时间字段的更新时点问题
- 计算机国考报哪些岗位,国考职位有哪些
- 单身社会如何生活-日本纪录片ガイアの夜明け系列
- 前后端交互ajax和axios入门讲解,以及http与服务器基础
- 通过DOS 将FAT32转为NTFS,NTFS转FAT32
- Master of Typing in Chinese Mac中文打字大师
- c语言 计步算法,基于51单片机的计步器设计
- 南非世界杯 小组赛 巴西vs葡萄牙