快速排序

介绍

快速排序(Quicksort) 是对冒泡排序的一种改进

基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

拿老师的例子来说:-9,78,0,23,-567,70,这几个数据从小到大排序

快排是什么意思呢,我们取一个值(可以更换)0,我们把比0小的放到左边,比0大的放到右边,注意:这个地方比0小的也就是左边不一定有序,右边也不一定有序的!!!

接着会递归这个过程,在左边再进行相同的操作,右边同样也是

图解

这个动态图是以第一个数为基准点的,注意不要搞错了

思路分析

还是这个数组**-9,78,0,23,-567,70**,我们按照老师所讲的按照0位基准

9的下标是0,70下标是5,那么就是5/2=2 下标为2的数字是0,我们拿0作为基准值

我们还需要两个辅助索引(不一定非要是2个)。一个用来遍历0左边的数据,是要找比0大的数

另一个是在右边找比0小的数字,那结果是什么

第一次:左边的索引找到了78所处的位置,右边找到的是-567这个位置,那么我们将其交换,然后重读这个过程,直至左边都是比0小的,右边都是比0大的-9,-567,0,23,78,70

然后在设定值的两边再次进行刚才的操作,也就是递归第一步。然后就会得到最后的排序结果-9,-567,0,23,70,78

推导过程

/*** @author 王庆华* @version 1.0* @date 2020/12/30 19:48* @Description TODO* @pojectname 快速排序算法*/
public class QuickSort {public static void main(String[] args) {int[] arr = {-9,78,0,23,-567,70};quickSort(arr,0,arr.length-1);System.out.println(Arrays.toString(arr));}public static void quickSort(int[] arr,int left,int right){int l = left;//左下标int r = right;//右下标int temp = 0;//临时变量,交换时使用//pivot 中轴int pivot = arr[(left+right)/2];//while循环的目的是让比pivot值小的放到基准值的左边,比他大的放右边while (l<r){//在pivot左边一直找,找到大于等于pivot的值才退出while (arr[l] < pivot){l+=1;}//在pivot右边一直找,找到小于等于pivot的值才退出while (arr[r] > pivot){r-=1;}//左边已经全部符合都小于基准值了if (l>=r){break;}//交换temp = arr[l];arr[l] = arr[r];arr[r] = temp;//如果交换后,发现这个arr[l] == pivot 值相等,r--:前移一步if (arr[l] == pivot){r-=1;}//如果交换后,发现这个arr[r] == pivot 值相等,l++:后移一步if (arr[r] == pivot){l+=1;}}}
}
[-9, -567, 0, 23, 78, 70]

最终代码

/*** @author 王庆华* @version 1.0* @date 2020/12/30 19:48* @Description TODO* @pojectname 快速排序算法*/
public class QuickSort {public static void main(String[] args) {int[] arr = {-9,78,0,23,-567,70};quickSort(arr,0,arr.length-1);System.out.println(Arrays.toString(arr));}public static void quickSort(int[] arr,int left,int right){int l = left;//左下标int r = right;//右下标int temp = 0;//临时变量,交换时使用//pivot 中轴int pivot = arr[(left+right)/2];//while循环的目的是让比pivot值小的放到基准值的左边,比他大的放右边while (l<r){//在pivot左边一直找,找到大于等于pivot的值才退出while (arr[l] < pivot){l+=1;}//在pivot右边一直找,找到小于等于pivot的值才退出while (arr[r] > pivot){r-=1;}//左边已经全部符合都小于基准值了,右边符合大于基准值if (l>=r){break;}//交换temp = arr[l];arr[l] = arr[r];arr[r] = temp;//如果交换后,发现这个arr[l] == pivot 值相等,r--:前移一步if (arr[l] == pivot){r-=1;}//如果交换后,发现这个arr[r] == pivot 值相等,l++:后移一步if (arr[r] == pivot){l+=1;}}//如果l == r 必须l++,r--,需要错开,不错开的话会栈溢出的if (l == r){l += 1;r -= 1;}//向左递归if (left < r){quickSort(arr,left,r);}if (right>l){quickSort(arr,l,right);}}
}

只是在推导过程最后加了递归的操作,挺抽象的,步骤挺多的,我们可以在排序的时候打一个断点来理解一下

算法笔记-------快速排序相关推荐

  1. 算法笔记-快速排序(C版本与Python版本)

    算法笔记-快速排序 作者:星河滚烫兮 前言   本文主要聚焦于算法的代码实现,原理不做详细说明,可参考代码注释.代码分为C语言版本和python版本,其中C语言版本对于基准元素是选择首元素的,这样对于 ...

  2. 算法笔记(JavaScript版)——排序

    算法笔记(JavaScript版)--排序 本文内容根据Rebert Sedgewick和Kevin Wayne的<算法(第四版)>整理,原代码为java语言,自己修改为JavaScrip ...

  3. 算法笔记(胡凡)学习笔记@Kaysen

    本文旨在记录算法笔记学习过程中的收获和一些知识点,部分易错知识点只针对个人而言,CCF-CSP考试冲鸭!!! Chapter 2 C/C++快速入门(易错知识点) 2.1 基本数据类型 变量定义注意区 ...

  4. 明翰数据结构与算法笔记V0.8(持续更新)

    文章目录 前言 数据结构 `线性表` `数组` `链表` `栈与队列` [串/字符串] 树 并查集 `二叉树` [二叉排序树/二叉搜索树] `红黑树` 红黑树操作 霍夫曼树 `堆` [大/小]根堆 可 ...

  5. 数据结构与算法笔记(青岛大学王卓老师视频)

    写在前面的话: 因为在学习数据结构之前,学习过一年的算法,所以有一些基础,一些我觉得 没必要的代码或知识就没写上,记得多是一些知识点,写的可能对于别人来说 很难接受,望谅解.我学习算法是在Acwing ...

  6. codeup墓地目录(算法笔记习题刷题笔记)

    在线codeup contest 地址:http://codeup.cn/contest.php Contest100000575 - <算法笔记>3.1小节--入门模拟->简单模拟 ...

  7. 《算法笔记》第四章笔记

    <算法笔记>第四章 排序 排序算法的思想都比较简单,而且c++可以直接用sort函数进行排序,一般不会直接写排序代码 归根到底就是每轮处理一个数据,n个数据只需处理n-1次即可变得有序 选 ...

  8. 《算法笔记》学习 入门篇

    目录 <算法笔记>学习 3.1 简单模拟 例1:[PAT B1001]害死人不偿命的(3n+1)猜想 例2:[PAT B1032]挖掘机技术哪家强 3.2 查找元素 例:[codeup 1 ...

  9. 算法笔记知识点整理大全

    每次刷题都觉得自己吃了知识点不全,基础不牢固的亏,刷题的时候目标也不明确,于是看完了算法笔记并把知识点归纳了一下,当然直接看书会更加详细,这个归纳只是学习时加深印象以及方便自己之后回顾而已:之后刷题大 ...

  10. 算法笔记CodeUp第一至第六章刷题记录

    文章目录 <算法笔记>2.2小节--C/C++快速入门->顺序结构 1.例题1-1-1 按要求输出信息(1) 2.例题1-1-2 按要求输出信息(2) 3.例题1-2-1 求两个整数 ...

最新文章

  1. PTA团体程序设计天梯赛-L2-019 悄悄关注
  2. 设立『自动驾驶虚拟仿真赛道』
  3. 【C 语言】数组 ( 数组指针 | 数组指针定义 | 直接定义 数组指针 )
  4. 深入FFM原理与实践
  5. radio被选中,但是重复点击后事件不触发
  6. exec su-exec_WildFly Kubernetes exec探针
  7. Lamda和kappa架构
  8. cocos2dx Action动作解析(1)
  9. 2017《时间的朋友》思维导图(脑图整理版)
  10. 小米A3真机开箱照片曝光:水滴屏+后置三摄
  11. JAVA练习题1(初级基本数据类型、运算符)
  12. 30个有助于探索Go编程语言的在线资源
  13. 最新如何在CentOS6版本上安装Teamviewer
  14. 互联网平台黑产解密(下)
  15. armv6, armv7, armv7s, arm64 的区别
  16. 客户下单邮件跟进书写
  17. 腾讯云服务器Lighthouse和CVM区别
  18. 拼多多怎么查看订单详情|盛天海科技
  19. 如何通过样本数据推断其分布
  20. 初学者怎样复制粘贴并运行VBA宏?

热门文章

  1. linux怎么重载mysql配置命令_在Linux系统中启动/停止/重新启动/启用/重新加载MySQL和MariaDB服务...
  2. linux c 语言编程如何把串口字符串数据写到txt文件中_C 语言简单编程速成 | Linux 中国...
  3. python数值类型和序列类型_Python基础 1数值类型 序列类型
  4. Antlr4 简单入门
  5. 算法笔记_二分查找/斐波那契查找
  6. OpenGL学习笔记_图形渲染管线及典型渲染流程(绘制一个三角形)
  7. OpenCV_Find Basis F-Matrix and computeCorrespondEpilines(获取一对图像的基础矩阵及对应极线)
  8. ML/DL-复习笔记【九】- 神经网络中各层的计算量与参数量
  9. 基于LOAM框架的激光SLAM开源程序汇总
  10. salt 服务启动失败