快速排序

1. 基本思想

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

2. 排序流程

快速排序算法通过多次比较和交换来实现排序,以从小到大排序为例,其排序流程如下:

  • 定义一个中值(一般是数组第一个元素),通过中值将数组分为两个部分
  • 将小于等于中值的元素集中在数组左半部分,将大于等于中值的元素集中在数组右半部分
  • 即数组的左半部分的值,均小于或等于中值,数组的右半部分的值,均大于或等于中值
  • 此时,又可以将数组的左半部分作为一个新的数组,右半部分也作为一个新的数组,重复上述按中值将数组分为两个部分的过程
  • 可以看出,此过程为递归过程,通过递归先将左半部分排好序,然后将右半部分排好序,即全数组都排好了序

3.排序步骤(图解)

下图只展示第一趟排序的过程,往下每一趟过程都重复此过程,只是数组的边界值发生变化

4.Java代码实现快速排序

4.1函数代码:
    public static int[] quickSort(int arr[],int left,int right) {int pivot = arr[left];//轴值int i = left;//左下标int j = right;//右下标while (i < j) {//在右边找到一个比中值小或者相等的值while (i < j && arr[j] > pivot) {j--;}//在左边找到一个比中值大或者相等的值while (i < j && arr[i] < pivot) {i++;}//在i和j没有相遇时,如果 arr[i] == arr[j] 此时让i+1//即让arr[i+1] 与arr[j]进行交换 ,使两个相同的数在一起if (arr[i] == arr[j] && i < j) {i++;} else {//交换int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}//左半部递归if (i-1 > left) {arr=quickSort(arr,left,i-1);}//右半部递归if (j+1 < right) {arr=quickSort(arr,j+1,right);}return arr;}
4.2测试:

测试用例:4,6,1,3,2,5 (与上图用例一致)

public class QuickSort {public static void main(String[] args) {int[] arr = {4,6,1,3,2,5};arr = quickSort(arr, 0, arr.length - 1);System.out.println("经过快速排序后的结果为:" + Arrays.toString(arr));}
}

测试结果:

5.算法分析

  • 时间复杂度

    • 最差:O(N^2),退化为冒泡排序
    • 最优:O(NlogN)
    • 平均:O(NlogN)
  • 空间复杂度
    • 递归调用消耗栈空间,因此为O(logN)
  • 快排是一个不稳定的排序算法
    • 33 33* 排序之后可能会变成 33* 33,即快速排序无法保证相等的元素的相对位置不变

快速排序——Java代码实现相关推荐

  1. 快速排序java代码_8 种排序算法与 Java 代码实现!

    1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中. 将第一个数和第二个数排序,然后构成一个有序序列 将第三个数插入进去,构成一个新的有序序列. 对第四个数.第五个数--直 ...

  2. 快速排序 java代码_java实现快速排序

    一:快速排序的特征 1:冒泡排序的改进 2:内部交换数据 3:分治+递归的思想 4:稳定排序 5:时间复杂度为:O(n*logn) 二:算法的整体思路 1:原始数据:12 11 6 87 23 8 5 ...

  3. 快速排序Java代码实现

    代码实现(附注释) import java.util.Arrays;public class Main {public static void main(String[] args) {int[] a ...

  4. 冒泡排序、快速排序 java代码实现

    文章目录 冒泡排序 源码实现 单元测试 优化 快速排序 源码实现 单元测试 冒泡排序 源码实现 package csdn.dreamzuora.sort;import java.util.List;/ ...

  5. java冒泡从大到小排序代码_Java 冒泡排序、快速排序实例代码

    冒泡排序 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地 进行直到没有再需要交换,也就是说该数列已经排序完成.这 ...

  6. Java实现快速排序详细代码

    Java代码实现 /****@author g0rez*@data 2021-05-19**/ public class 快速排序 {public static void main(String[] ...

  7. 买什么数据结构与算法,这里有:动态图解十大经典排序算法(含JAVA代码实现)

    上篇的动图数据结构反响不错,这次来个动图排序算法大全.数据结构与算法,齐了. 几张动态图捋清Java常用数据结构及其设计原理 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: ...

  8. java array 元素的位置_数据结构与算法:动态图解十大经典排序算法(含JAVA代码实现)...

    点击上方"JAVA",星标公众号 重磅干货,第一时间送达 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: 冒泡排序 选择排序 插入排序 希尔排序 归并排 ...

  9. java代码_Java 代码实现排序算法

       阅读本文约需要8分钟  大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下SpringBoot+Gradle+ MyBa ...

最新文章

  1. Htc Vive VR 手势识别插件教程 1.1 版本(附1.0版本教程PDF)
  2. 中国SaaS死或生之四:卧榻之侧,是谁在捅刀 SaaS?
  3. python消息推送_Python阿里云消息推送调用API
  4. jupyter ipython display_Tensorflow从jupyter / Ipython运行动画
  5. 收集100条实用的网络知识
  6. php里面的mark,PHP CommonMarkCQL 用法 手册 | 示例代码
  7. python中的self含义及使用方法
  8. 开启php缩略图,PHP生成缩略图
  9. android包结构规范,【Android】Android产品-开发规范
  10. 代码整洁之道(二)优雅注释之道
  11. java 内存情况_Java代码中获取运行时内存情况
  12. 【专家专栏】浅谈百度搜索排序
  13. stm32F407 调试 LAN8720A ping不通问题解决
  14. snakeyaml操作yml文件中注释的处理
  15. 【从零开始学习Go语言】一.初识Go语言
  16. 通过高德api获取经纬度
  17. 华视电子web读取身份证信息
  18. 免费版软件文档文件格式转换
  19. 巨噬细胞膜包覆的负载二氧化锰MnO2和顺铂Pt的仿生纳米粒(齐岳)
  20. Mixly for Arduino(图形化编程工具) Mac安装

热门文章

  1. 22.12.14补卡 Constructing Roads POJ - 2421
  2. CUDA---从入门到升华
  3. 实时社群技术专题(一):支持百万人超级群聊,一文读懂社群产品Discord
  4. 如何更改Apple Watch上的表盘
  5. chubby中文意思
  6. SwiftUI AppClip 之01 开发AppClip应知应会
  7. pytorch 梯度累积(gradient accumulation)
  8. Pandas 分组占比
  9. 第一次考PAT甲级,95分,分享一下自己的心得体会
  10. 如果MQTT Client 想接收离线消息