排序算法-Java实现快速排序算法

开篇介绍
大家好,公众号【Java极客思维】近期会整理一些Java高频面试题分享给小伙伴,也希望看到的小伙伴在找工作过程中能够用得到!本章节主要针对Java快速排序算法的实现进行分享。
首先,来看一下,快速排序的实现的动态图:

快速排序介绍:
快速排序,根据教科书说法来看,是冒泡排序的一种改进。
快速排序,由一个待排序的数组(array),以及找准三个变量:
中枢值(pivot)
左值(left)
右值(right)
根据中枢值(pivot)来做调整,将数组(array)分为三个部分:
第一部分:中枢值(pivot),单独数字构成,这个值在每次排序好的"最中间";
第二部分:左边数组(由array的一部分组成),这个数组在第一部分 中枢值(pivot) 的"左边",其中左边数组中的每一个值(不一定是排序好的,可能是乱序的),都要比中枢值和右边数组的值要小;
第三部分:右边数组(由array的一部分组成),这个数组在第一部分 中枢值(pivot)的"右边",其中右边数组的每一个值(不一定是排序好的,可能是乱序的),都要比中枢值和左边数组的值要大
以上就是快速排序要做的第一步,将数组按照:左边数组 、 中枢值 、 右边数组 区分开来。
再根据 递归思想 , 对 左边数组 、 中枢值 、 右边数组 不断递归循环操作,不断拆分出三部分来,最终达到快速排序的效果。
核心逻辑:

快排算法递归调用:

接下来附上完整实现代码:
public class QuickSort {
/**
* 快速排序调用方法
*
* @param ary 待排序数组
* @param left 左值
* @param right 右值
* @return int值
* @author Cansluck
*/
public static int getSortNum(int[] ary, int left, int right) {
// 定义一个中枢值pivot,让其等于数组的左值,枢轴选定后永远不变,最终在中间,前小后大
int pivot = ary[left];
while (left < right) {
// 看后面ary[right] > pivot比较,如果右边数组值大于中枢值,说明不需要调整位置,则让右值(right)自减1
while (left < right && ary[right] >= pivot) {
right--; // 执行自减操作
}
// 如果上面循环不符合条件的,则说明右边数组的一个值,小于中枢值(pivot),则将其替换到左边数组中
ary[left] = ary[right];
// 看后面ary[left] < pivot比较,如果左边数组值小于中枢值,说明不需要调整位置,则让左值(left)自增1
while (left < right && ary[left] <= pivot) {
left++; // 执行自增操作
}
// 如果上面循环不符合条件,则说明左边数组的一个值,大于中枢值(pivot),则将其替换到右边数组中
ary[right] = ary[left];
}
// 最后将中枢值给自增后的左边数组的一个值中
ary[left] = pivot;
// 返回左边数组下标
return left;
}
/**
* 快速排序递归方法
*
* @author Cansluck
* @param ary 待排序数组
* @param left 左值
* @param right 右值
*/
public static void quickSort(int[] ary, int left, int right) {
// 定义中枢值
int pivot;
// 判断
if (left < right) {
// 根据方法得到了每次中枢值的位置
pivot = getSortNum(ary, left, right);
// 根据中枢值(pivot),来对左边数组进行递归调用快速排序
quickSort(ary, left, pivot - 1);
// 根据中枢值(pivot),来对右边数组进行递归调用快速排序
quickSort(ary, pivot + 1, right);
}
}
public static void main(String[] args) {
int[] ary = {97, 58, 12, 88, 77, 22, 33, 44, 66, 22};
quickSort(ary, 0, ary.length - 1);
for (int i = 0; i < ary.length; i++) {
if (i != ary.length - 1)
System.out.print(ary[i] + ", ");
else
System.out.println(ary[i]);
}
}
}
以上就是快速排序的详细介绍及完整实现。有兴趣的小伙伴也自行实现以下吧~
点关注、不迷路
如果觉得文章不错,欢迎关注、点赞、收藏,你们的支持是我创作的动力,感谢大家。
如果文章写的有问题,请不要吝啬,欢迎留言指出,我会及时核查修改。
如果你还想更加深入的了解我,可以微信搜索「Java极客思维」进行关注。每天8:00准时推送技术文章,让你的上班路不在孤独,而且每月还有送书活动,助你提升硬实力!
排序算法-Java实现快速排序算法的更多相关文章
- 排序算法系列:快速排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)
在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 为了不误人子弟耽误时间,推荐看一些靠谱的资源,如[啊哈!算法]系列: https: ...
- java实现快速排序算法
1.算法概念. 快速排序(Quicksort)是对冒泡排序的一种改进.由C. A. R. Hoare在1962年提出.2.算法思想. 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据 ...
- AJPFX实践 java实现快速排序算法
快速排序算法使用的分治法策略来把一个序列分为两个子序列来实现排序的思路: 1.从数列中挑出一个元素,称为“基准“2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面 ...
- 排序算法:图解快速排序算法--不超过18行代码Python和JavaScript实现快速排序算法
快速排序有三大要素 分别是 第一:找基准值--key 第二:分区 第三:比较数字大小 先来看下快速排序流程: 基准值key选取了第一个元素78 基准值是可以任意一个元素 因为选择了最左边的数据,那么就 ...
- python算法与数据结构-快速排序算法(36)
一.快速排序的介绍 快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外 ...
- JAVA分析html算法(JAVA网页蜘蛛算法)
近来有些朋友在做蜘蛛算法,或者在网页上面做深度的数据挖掘.但是遇到复杂而繁琐的html页面大家都望而却步.因为很难获取到相应的数据. 最古老的办法的是尝试用正则表达式,估计那么繁琐的东西得不偿失,浪费 ...
- 快速排序算法 java 实现
快速排序算法 java 实现 快速排序算法Java实现 白话经典算法系列之六 快速排序 快速搞定 各种排序算法的分析及java实现 算法概念 快速排序是C.R.A.Hoare于1962年提出的一种划分 ...
- Java数据结构和算法(五)--希尔排序和快速排序
在前面复习了三个简单排序Java数据结构和算法(三)--三大排序--冒泡.选择.插入排序,属于算法的基础,但是效率是偏低的,所以现在 学习高级排序 插入排序存在的问题: 插入排序在逻辑把数据分为两部分 ...
- 八大排序算法Java
目录(?)[-] 概述 插入排序直接插入排序Straight Insertion Sort 插入排序希尔排序Shells Sort 选择排序简单选择排序Simple Selection Sort 选择 ...
随机推荐
- linux修改网卡的mac地址
linux在安装一些软件的时候可能会用到修改主机的mac地址的问题,在网卡配置文件 /etc/network/interface 中添加mac地址的方式我在修改重启机器后没有生效,所以采用其他方式 在 ...
- JavaScript复习大纲
1. HTML.CSS和JavaScript各自在网页设计中的作用. 1.HTML生成结构. 2.CSS样式美化. 3.JavaScript的作用: (1) 操作HTML及CSS,让网页具有动态行为. ...
- Java 合并多个文件内容到一个文件(递归遍历某个文件夹下所有文件)
这段代码通过Java I/O流API实现将多个文件合并到一个文件中,输出为文本文件,提供一个支持语法高亮的网站,http://www.codeinword.com/ 适合粘贴代码到word文档,小巧实 ...
- Monitor的扩展支持string的超时锁
对Monitor的使用可以防止lock的时间过长并且可以设置其对应的超时时间达到对预期代码的一个控制,合理的使用timeout可以有助于程序的健壮性.但是对于不同的并发程序可能某些时候我们需要的粒度是 ...
- Seay源代码审计系统使用
Seay源代码审计系统简介 Seay源代码审计系统使用 如何使用"Seay源代码审计系统"扫描源代码漏洞 Seay源代码审计系统下载安装 github-Seay源代码审计系统
- 安装swoole扩展
wget https://github.com/swoole/swoole-src/archive/v1.9.3-stable.tar.gz tar -zxvf v1.9.3-stable.tar.g ...
- jmeter简单的压力测试
Jmeter是一个非常好用的压力测试工具. Jmeter用来做轻量级的压力测试,非常合适,只需要十几分钟,就能把压力测试需要的脚本写好.相比LR来说操作简单方便,关键是免费,基于JAVA开发,所以需 ...
- SpringSecurity之整合JWT
SpringSecurity之整合JWT 目录 SpringSecurity之整合JWT 1. 写在前面的话 2. JWT依赖以及工具类的编写 3. JWT过滤器 4. 登录成功结果处理器 5. Sp ...
- Java蓝桥杯练习——杨辉三角形
问题描述: 杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数. 它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加. 下面给出了杨辉三角形的前4行: 1 1 1 ...
- dubbo起停之服务注解
开始之前建议先去了解spring的BeanDefinition可以参考下这里:https://www.jianshu.com/p/56e42e82e9a0 当用户使用注解@DubboComponent ...