title: 快速排序算法(基于Java实现)
tags: 快速排序算法


快速排序算法的原理与代码实现:

一、快速排序算法的原理

快排算法的思想是: 如果需要排序数组中下标从p到r之间的一组数据,我们选择p到r之间的任意一个数据作为pivot(分区点)。我们遍历p到r之间的数据,将小于pivot的放到左边,将大姨pivot的放在右边,将pivot放到了中间。经过这样的操作之后,数组中的数据就被分成了三个部分了,前面的p到q-1之间的都是小于pivot的,中间是pivot,后面的q+1到r之间是大于pivot的。

然后,根据分治、递归思想,我们可以递归排序下标从p到q-1之间的数据和q+1到r之间的数据,直到区间缩小为1,就说明所有的数据有序了。

如果看到这里还是不能理解这个过程,推荐这个博客上(https://blog.csdn.net/u014241071/article/details/81565148),该博客利用一个实例去很详细地讲述快排算法的一个实现过程,但是那个博主的代码有点乱,好像还有点问题,所以我就自己亲自动手实现了一下。

二、快速排序算法的代码实现

package com.company;import java.util.Arrays;public class QuickSort2 {public static void quickSort(int[] a, int p, int r){if(p>r) return;int q = partition(a, p, r);quickSort(a, p, q-1);quickSort(a, q+1, r);}public static int partition(int[] a, int p, int r) {int i = p;int j = r;int tmp = a[p];//tmp为基数while (i < j) {while (tmp <= a[j] && i < j) {j--;}swap(a, i, j);while (tmp >= a[i] && i < j) {i++;}swap(a, i, j);}return i;}public static void swap(int[] a, int i, int j){int temp = a[j];a[j] = a[i];a[i] = temp;}public static void main(String[] args) {//int[] a = {10, 9, 7, 4, 3, 2, 1, 8};int[] a = {6, 11, 3, 9, 8};System.out.println("之前的排序:");System.out.println(Arrays.toString(a));quickSort(a, 0,4);System.out.println("之后的排序:");System.out.println(Arrays.toString(a));}
}

输出的结果为:

之前的排序:
[6, 11, 3, 9, 8]
之后的排序:
[3, 6, 8, 9, 11]

三、快速排序算法性能分析

因为分区的过程涉及交换操作,如果数组中有两个相同的元素,比如序列 6,8,7,6,3,5,9,4,在经过第一次分区操作之后,两个 6 的相对先后顺序就会改变。所以,快速排序并不是一个稳定的排序算法

快排也是用递归来实现的。如果每次分区操作,都能正好把数组分成大小接近相等的两个小区间,那快排的时间复杂度递推求解公式跟归并是相同的。所以,快排的时间复杂度也是 O(nlogn)

在快排算法中,我们通过游标 i 把 A[p…r-1]分成两部分。A[p…i-1]的元素都是小于 pivot 的,我们暂且叫它“已处理区间”,A[i…r-1]是“未处理区间”。我们每次都从未处理的区间 A[i…r-1]中取一个元素 A[j],与 pivot 对比,如果小于 pivot,则将其加入到已处理区间的尾部,也就是 A[i]的位置。那么,我们只需要将 A[i]与 A[j]交换,就可以在 O(1) 空间复杂度内将 A[j]放到下标为 i 的位置。故,快速排序是一个原地排序算法,空间复杂度为O(1)

快速排序算法(基于Java实现)相关推荐

  1. 随机快速排序算法(java)

    随机快速排序算法最坏时间复杂度O(n^2). 快速排序主要做的任务就是,选取一个基准值x,然后将小于x的值放在区域左边,等于x的值放在中间,大于x的值放在区域的右边.而孙随机快速排序则是从趋于中随机选 ...

  2. 快速排序算法(java实现)

    基本思想 快速排序是一种采用分治法解决问题的一个典型应用,也是冒泡排序的一种改进.它的基本思想是,通过一轮排序将待排记录分割成独立的两部分,其中一部分均比另一部分小,则可分别对这两部分继续进行排序,已 ...

  3. 数据结构和算法——基于Java——1.数组

    稀疏数组 理论补充 运用场景:当一个数组中大部分元素为0,或者为统一值的数组时.可以使用稀疏数组压缩数组释放占用的内存空间. 思想:第一行存储原数组:行,列,值.后续行存储原数组数据所在行,列,值. ...

  4. 桶排序算法(基于Java实现)

    title: 桶排序算法(基于Java实现) tags: 桶排序算法 桶排序算法的原理和代码实现 一.桶排序算法的原理 桶排序,顾名思义,会用到"桶",核心思想是将要排序的数据分到 ...

  5. java随机数排序算法_理解快速排序算法

    快速排序在平均状况下,排序n个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n^2)次比较,但这种状况并不常见.事实上,快速排序通常明显比 其他Ο(n log n)算法更快,因为它的内部循环 ...

  6. 基数排序算法(基于Java实现)

    title: 基数排序算法(基于Java实现) tags: 基数算法 基数排序算法原理及代码实现: 一.基数排序算法的原理 基数排序属于"分配式排序",又称"桶子法&qu ...

  7. 选择排序算法(基于Java实现)

    title: 选择排序算法(基于Java实现) tags: 选择算法 选择排序算法原理及代码实现: 一.选择排序算法的原理 选择排序算法的实现思路有点类似插入排序,也分已排序区间和未排序区间.但是选择 ...

  8. 插入排序算法(基于Java实现)

    title: 插入排序算法(基于Java实现) tags: 插入算法 插入排序算法原理及代码实现: 一.插入排序算法的原理 首先,我们将数组中的数据分为两个区间,已排序区间和未排序区间.初始已排序区间 ...

  9. java sort算法名称_快速排序算法(Quick Sort)(java)

    /** * 快速排序算法是基于分治策略的一种排序算法,下面是一个递归的快速排序. * @author liuy */ public class QuickSort { public static vo ...

最新文章

  1. 不用深度学习,怎么提取图像特征?
  2. 89岁屠呦呦再次震惊世界!视频介绍疟疾、青蒿素和背后的故事
  3. 清北学堂模拟赛d5t4 套路
  4. django 创建APP 后找不到 templates文件夹下的Html文件
  5. python可视化爬虫框架_8个最高效的Python爬虫框架
  6. 触摸屏校准没反应,启动时出现No raw modules loaded.ts_config:No such file or directory错误的解决
  7. Spark算子篇 --Spark算子之combineByKey详解
  8. 修改文章更新缓存php,php – 使用liipImagineBundle更新/删除记录时删除/更新缓存的图像...
  9. 解决RHEL6 vncserver 启动 could not open default font 'fixed'错误.
  10. win10PE安装到硬盘
  11. 数列求和再求极限问题
  12. mysql 5.6 cmake 参数_编译cmake MySQL 5.6.10报错
  13. 中国石油行业并购重组趋势与投资战略规划建议报告2022~2028年
  14. TDMA解调接收机IP core
  15. 1017:浮点型数据类型存储空间大小
  16. 共享打印机找不到网络路径的解决方法
  17. android拷机工具,【AndroidFramework】【EMMC拷机】混合拷机时盒子待机
  18. uniapp网易严选项目
  19. 网络直播对网络的要求有多高
  20. 批量下载ERA5数据(Python+IDM)

热门文章

  1. Java 四种引用类型:强引用、软引用、弱引用、虚引用
  2. IOS后台运行机制详解(一)
  3. 将特定像素点在图像上连接起来_(NeurIPS 2019) Gated CRF Loss-一种用于弱监督图像语义分割的新型损失函数...
  4. 那些学校计算机招不满,那些招不满人的985院校,请留意!
  5. oracle10g应用,2017企业级Oracle10g数据库管理与应用
  6. 【PHPWord】TextRun
  7. powerbook g4装linux,揭秘:服务器操作系统Linux版本发行
  8. 流程图虚线箭头的意思_Ai篇NO.3: 怎样画出不死板的箭头?
  9. python 画出决策边界_决策边界可视化,让你的分类合理有序
  10. mysql索引能重复吗_mysql重复索引与冗余索引实例分析