排序算法是java数据结构的基础,也是程序员必备的基础算法之一,个人认为,了解并掌握排序算法的思想比起单纯用代码实现功能更有意义,毕竟创造这套算法的思想才是最高的智慧嘛,下面就来说说关于排序算法中的比较经典的算法——快速排序;

先用几张示意图来说说快速排序的思想,

1、首先给定一个无序的数组,定义两个指针i和j,他们的起始位置分别是左边的最小下标和右边的最大下标,同时为方便起见,这里使用数组的第一个数作为基准值,这个基准值就是整个快速排序过程中第一轮循环需要使用的值,

2、首先移动j的值,从最右边开始查找,找到第一个比66小的值,即找到第一个小于基准值的值,然后取出来,填补到66所在的第一个位置,即i=0处,

找了第一个比66小的值42,取出来,填充到1=0处,然后,再移动左指针,从左往右找,找到第一个比66大的值,88,填补j=5的位置,

然后,再从右边向左边找,移动j,每次j–,找到比66小的位置,再从左往右找,重复上面的过程,直到i=j两个位置重合,此时的意思是i=j的位置上,左边的数都比66小,右边的都比66大,第一轮循环查找结束,同时将66填充到i=j=4的位置上;

接下来,将以i=j=66的位置为分界线,分成左右两个新的数组,左右两边的数组同样适用上述的方式进行查找排序,由此,我们是不是可以想到适用什么比较适合呢?没错,就是递归,接下去就是递归不断重复排序的过程,最终可以得到排序后的数组;

下面用具体的代码来实现排序的功能,具体的解释可参考注释,

public class FastSortOrderMath {public static void main(String[] args) {//1、给定一个无序数组int[] arr = {66,13,58,88,59,42,83,74,48,95};//2、输出无序数组System.out.println(Arrays.toString(arr));//3、快速排序quickSort(arr);//4、输出排序后的有序数组System.out.println(Arrays.toString(arr));}public static void quickSort(int[] arr) {int low = 0;int high = arr.length - 1;quickSort(arr,low,high);}private static void quickSort(int[] arr, int low, int high) {if(low < high){//分区,将一个数组分成两个数组,找到分区界限的值的索引并返回int index = partition(arr,low,high);//对左边的分区进行快排quickSort(arr,low,index-1);//再对右边的分区进行快排序quickSort(arr,index+1,high);}}//分区方法private static int partition(int[] arr, int low, int high) {//指定两个指针i , jint i = low;int j = high;//将第一个数作为基准值,挖坑int x = arr[low];//使用循环进行分区操作while(i<j){//1、从右向左移动,找到第一个小于基准值的值,arr[j]while(arr[j] >= x && i<j){j--;}//2、将右侧找到的小于基准值的值取出来填充到左边的 i的位置即坑的位置,然后i++,左指针向中间移动位置if(j > i){arr[i]=arr[j];i++;}//3、再从左侧i的位置开始移动,找到第一个大于基准值的位置arr[i]while(arr[i] < x && i<j){i++;}//4、将左侧找到的大于等于基准值的值加入到右侧的坑中,然后右指针向左边移动一个位置,j--if(i<j){arr[j] = arr[i];j--;}}//使用基准值填坑,这个就是基准值的最后的位置arr[i]=x;//返回基准值所在的索引位置return i;}

运行一下,看到控制台的打印结果,

总结来说,快速排序 = 冒泡+分区治理+递归,整个过程用一句通俗的话来说,就是东拆西补或西拆东补,一边拆,一边补,这样的思想是不是很有意思。

以上演示了快速排序的过程,由于个人经验有限,如有理解上的偏差,请多多包涵,示意图的细节没有全部添加,主要是帮助理解排序过程,谢谢观看!

java数据结构之快速排序相关推荐

  1. java队列_如何彻底搞懂 Java 数据结构?CSDN 博文精选

    作者 | 张振华.Jack 责编 | 郭芮 出品 | CSDN 博客 本文和大家一起来重温<Java数据结构>经典之作. Java数据结构 要理解Java数据结构,必须能清楚何为数据结构? ...

  2. Java数据结构与算法——插入排序

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本篇文章介绍排序算法中插入排序算法,包括插入排序的思路,适用场景,性能分析,ja ...

  3. java数据结构排序实验报告_java数据结构与算法之插入排序详解

    本文实例讲述了java数据结构与算法之插入排序.分享给大家供大家参考,具体如下: 复习之余,就将数据结构中关于排序的这块知识点整理了一下,写下来是想与更多的人分享,最关键的是做一备份,为方便以后查阅. ...

  4. java 固定长度队列_如何彻底搞懂 Java 数据结构?|CSDN 博文精选

    作者 | 张振华.Jack 责编 | 郭芮 出品 | CSDN 博客 本文和大家一起来重温<Java数据结构>经典之作. Java数据结构 要理解Java数据结构,必须能清楚何为数据结构? ...

  5. 【笔记】Java数据结构与算法

    [笔记]Java数据结构与算法 文章目录 [笔记]Java数据结构与算法 1.八大排序应用场景 2.未完待续-- 1.八大排序应用场景 冒泡排序:优化后的冒泡排序可用于当数据已经基本有序,且数据量较小 ...

  6. 如何彻底搞懂 Java 数据结构?|CSDN 博文精选

    作者 | 张振华.Jack 责编 | 郭芮 出品 | CSDN 博客 本文和大家一起来重温<Java数据结构>经典之作. Java数据结构 要理解Java数据结构,必须能清楚何为数据结构? ...

  7. Java数据结构与算法(二)

    Java数据结构与算法(二) 第六章 递归 1 递归应用场景 2 递归的概念 3 递归调用机制 4 递归能解决什么样的问题 5 递归需要遵守的重要规则 6 递归-迷宫问题 6.1 迷宫问题 6.2 代 ...

  8. 头歌JAVA数据结构答案

    头歌JAVA数据结构答案 一.Java数据结构-循环链表的设计与实现 第1关 单循环链表的实现-链表的添加.遍历 package step1; /*** Created by sykus on 201 ...

  9. Java数据结构与算法入门

    原文:https://blog.csdn.net/qq_37101453/article/details/80142147 第一部分:Java数据结构 要理解Java数据结构,必须能清楚何为数据结构? ...

最新文章

  1. PHP利用jpgraph类画折线图
  2. caffe学习(六):使用python调用训练好的模型来分类(Ubuntu)
  3. HashMap底层实现原理,红黑树,B+树,B树的结构原理,volatile关键字,CAS(比较与交换)实现原理
  4. 到底什么是 OAuth 2.0
  5. Flowable 数据库表结构 ACT_RU_VARIABLE
  6. php 延时显示代码,php 延时显示代码
  7. 己所不欲,勿施于人的意思,这句话出自哪里?
  8. LeetCode 236. 二叉树的最近公共祖先(递归)
  9. 怎么用python语法1234_python 基本语法1
  10. Linux之Mysql升级
  11. anylogic和java_使用Anylogic访问服务器及文件系统
  12. 交安ABC考试单选练习题库
  13. C 中用语言描述出下述方法的功能,2015年10月自考《大学语文》模拟试题及答案4...
  14. c语言程序填空 功能:输出结果为:,C语言程序填空题
  15. 测试基础知识1 》》软件测试入门
  16. selenium自动化测试随笔,安装selenium
  17. 手写实现一个HashMap
  18. eclipse官方下载32位和64位的具体步骤
  19. 2018东南大学 SUS 十一欢乐赛 pwn解题记录
  20. 基于Stm32f407 的贪吃蛇小游戏【正点原子-探索者开发板】

热门文章

  1. ubuntu server执行sudo出现no talloc stackframe at ../source3/param/loadparm.c:4864, leaking memory...
  2. SF :Salesforce中,look up 和 master detail关系
  3. git多人合作时,恢复误删文件
  4. mod_rewrite
  5. web前端新手入门教程:Web 框架的架构模式探讨
  6. Cisco PT模拟实验(8) 三层交换机的基本配置
  7. 博客专题计划:《在实践中深入理解常见网络协议》
  8. 角色和权限Hibernate实体映射配置
  9. 程序员应该知道的一些很cool网站
  10. 使用createObject(createObjectEx)创建silverlight对象