排序算法-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 选择 ...
随机推荐
- shell编程之算术扩展(引号、命令替换、算术扩展)
1.单引号 .双引号.反引号的区别 单引号:忽略所有特殊字符 双引号:忽略大部分特殊字符($ `等字符除外) [root@tlinux shell]# echo '*' * [root@tlinux ...
- ELF文件格式内容
在计算机科学中,是一种用于二进制文件.可执行文件.目标代码.共享库和核心转储格式文件. ELF文件组成部分 ELF文件由4部分组成,分别是ELF头(ELF header).程序头表(Program ...
- docker生产——容器通信
简介 在接触docker的第一天起,大家应该就知道:docker容器使用沙箱机制,相互之间没有接口,一般情况下内部访问通过IP+端口.本地容器默认分配的IP极易发生变化,所以靠IP+端口访问的方式缺失 ...
- Ceph 状态报警告 pool rbd has many more objects per pg than average (too few pgs?)
定位问题 [root@lab8106 ~]# ceph -s cluster fa7ec1a1-662a-4ba3-b478-7cb570482b62 health HEALTH_WARN pool ...
- Python_网络编程_socket()
什么是 Socket? Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. 详细资 ...
- 面试常问的 25+ 个 Linux 命令
作为一个Java开发人员,有些常用的Linux命令必须掌握.即时平时开发过程中不使用Linux(Unix)或者mac系统,也需要熟练掌握Linux命令.因为很多服务器上都是Linux系统.所以,要和服 ...
- Linux Shell操作 执行C代码显示当前路径
在unix系统下一切皆文件,文件夹是文件的一种.设备也会对应到相应的文件类型. 基础知识: . 代表当前路径 ..代表上级目录(父目录) / 在路径的最前边的时候代表树根.在路径中间的时候只不过是路径 ...
- mac实用软件推荐 mac好用的软件
终于入手了梦寐以求的苹果电脑,但却发现其操作系统与Windows大相径庭!不会使用怎么办?不用担心,我们可以借助软件的力量.一款实用的Mac软件不仅能够使你的工作效率显著提高,同时它还能帮助你更快地熟 ...
- Boom 3D的广播有哪些,有啥特色
Boom 3D(Windows系统)不仅为用户提供了包括3D立体音效.古典音乐音效在内的多种音效增强功能,而且还为用户提供了广播功能.该广播功能不仅涵盖了国内广播节目,而且还涵盖了国际广播节目. 接下 ...
- workerman windows环境下无法启动问题
问题描述 使用laravel框架composer加载workerman/gateway-worker扩展使用workerman做客服系统.通过laravel的command命令: php artisa ...