算法思想

从待排序数组中找一个索引位置(例如,中间位置、开始位置、结束位置)的数作为轴,以这个轴为基准,把大于这个轴的数放到它的后面,把小于这个轴的数放到它的前面,至于相等的可以放在前面也可以放在后面;

轴定好位置后,就不动了,也不对它进行操作(排序)了;

然后再重复上述步骤对左右两边的数据进行排序。

代码实现

以结束位置为轴

public static void main(String[] args) {int[] arr = {2, 5, 6, 8, 9, 7, 4, 1, 3, 0, 10};sort(arr, 0, arr.length - 1);System.out.println("最后结果:" + Arrays.toString(arr));
}/**
* 分区
* @param arr   待排序数组
* @param left  当前待排序数组(不一定是整个数组)的左指针
* @param right 当前待排序数组(不一定是整个数组)的轴
*/
private static void sort(int[] arr, int left, int right) {// 递归的结束条件if (left >= right) {return;}int pivot = partition(arr, left, right);// 左侧递归sort(arr, left, pivot - 1);// 右侧递归sort(arr, pivot + 1, right);
}/**
* 分区
* @param arr   待排序数组
* @param left  当前待排序数组(不一定是整个数组)的左指针
* @param right 当前待排序数组(不一定是整个数组)的轴
*/
private static int partition(int[] arr, int left, int right) {// 轴,即right是本次轴的位置int pivot = arr[right];// 左指针,指向本次排序的开始位置int i = left;// 右指针,指向本次排序的倒数第二个位置,因为最后一个位置是轴的位置int j = right - 1;// 左侧指针索引小于右侧指针索引,其中等号是为了二数比较的时候可以保证大小顺序正确while (i <= j) {// 左指针从左向右移找到“第一个”大于轴的索引位置,且不能移过了头while (i <= j && arr[i] <= pivot) {i++}// 右指针从右向左移找到“第一个”小于轴的索引位置,且不能移过了头while (i <= j && arr[j] > pivot) {j--}if (i < j) {// 交换上边找到的大数和小数的位置,使大数往后靠,小数往前靠swap(arr, i, j);}}/* 移动轴的位置,使轴的位置位于“中间”,它的左边全是小于(等于)它的数,它的右边全是大于它的数此时的i是大数区域第一个大数的索引位置*/swap(arr, i, right);  // 返回轴的位置;right是为待排序数组设定的轴,一开始轴的位置;i是移动轴之后的位置,即本次排序结束的位置return i;
}/**
* 交换数组元素位置(有两个地方用到了,直接拆出来)
*/
private static void swap(int[] arr, int i, int j) {int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;
}

以开始位置为轴(其他的逻辑同上)

/**
* 分区
* @param arr   待排序数组
* @param left  当前待排序数组(不一定是整个数组)的轴
* @param right 当前待排序数组(不一定是整个数组)的右指针
*/
private static int partition(int[] arr, int left, int right) {// 轴,即right是本次轴的位置int pivot = arr[left];// 左指针,指向本次排序的开始位置int i = left + 1;// 右指针,指向本次排序的倒数第二个位置,因为最后一个位置是轴的位置int j = right;// 左侧指针索引小于右侧指针索引,其中等号是为了二数比较的时候可以保证大小顺序正确while (i <= j) {// 左指针从左向右移找到“第一个”大于轴的索引位置,且不能移过了头while (i <= j && arr[i] <= pivot) {i++}// 右指针从右向左移找到“第一个”小于轴的索引位置,且不能移过了头while (i <= j && arr[j] > pivot) {j--}if (i < j) {// 交换上边找到的大数和小数的位置,使大数往后靠,小数往前靠swap(arr, i, j);}}/* 移动轴的位置,使轴的位置位于“中间”,它的左边全是小于(等于)它的数,它的右边全是大于它的数此时的j是小数区域第一个小数的索引位置*/swap(arr, j, left);  // 返回轴的位置;left是为待排序数组设定的轴,一开始轴的位置;j是移动轴之后的位置,即本次排序结束的位置return j;
}

以中间位置为轴

复杂度和稳定性

时间复杂度

  • 最好时间复杂度:
  • 最坏时间复杂度:    ——出现在排好序的情况下
  • 平均时间复杂度:

空间复杂度:

稳定性:不稳定

参考文章

https://www.runoob.com/w3cnote/ten-sorting-algorithm.html

【算法Algorithm】快速(Quick)排序相关推荐

  1. Algorithm:C++语言实现之内排序、外排序相关算法(插入排序 、锦标赛排序、归并排序)

    Algorithm:C++语言实现之内排序.外排序相关算法(插入排序 .锦标赛排序.归并排序) 目录 一.内排序 1.插入排序 2.锦标赛排序 3.归并排序 二.外排序 1.过程 一.内排序 1.插入 ...

  2. algorithm中的排序算法详解

    文章目录 前言 一.algorithm是什么? 二.有哪些排序算法? sort random_shuffle merge reverse 总结 前言 雨下不停,爱意难眠,说一下algorithm中的几 ...

  3. Kylin高级主题-Cube构建算法介绍(逐层算法和快速算法)

    Apache Kylin是一个开源的分布式分析引擎,提供Hadoop之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据.它能在亚秒内查询巨大的Hive表.本文将详细介绍Apache Ky ...

  4. 出自上帝之手的精妙算法 - Algorithm from THE BOOK (1)

            <Proofs from THE BOOK>是一本非常出名的书籍, 收录了不少精妙的证明.         类似地, 在cstheory.stackexchange.com ...

  5. 算法基础-十大排序算法及其优化(文末有抽奖福利哦)

    算法基础-十大排序算法及其优化 算法基础-十大排序算法及其优化 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kw1LA5Q4-1607527572080)(/uplo ...

  6. 算法 - 十大经典排序算法(动图演示)

    [TOC] 算法 - 十大经典排序算法(动图演示) ​ 在计算机科学与数学中,一个排序算法(英语:Sorting algorithm)是一种能将一串资料依照特定排序方式进行排列的一种算法.最常用到的排 ...

  7. 数据结构和算法系列5 七大排序之冒泡排序和快速排序

    排序是我们生活中经常会面对的问题.同学们做操时会按照从矮到高排列:老师查看上课出勤情况时,会按学生学号顺序点名:高考录取时,会按成绩总分降序依次录取等.排序是数据处理中经常使用的一种重要的运算,它在我 ...

  8. STL算法algorithm,

    2019独角兽企业重金招聘Python工程师标准>>> STL算法部分主要由头文件<algorithm>,<numeric>,<functional&g ...

  9. 算法章节 递归、排序、⼆分查找

    递归 概念与特性 函数调⽤函数⾃身的编程⽅式叫做递归,调⽤为"递",返回为"归" 三个条件 1. ⼀个问题的解可以分解为多个⼦问题的解: 2. 分解之后的⼦问题 ...

最新文章

  1. objcopy的详细说明
  2. QuickWAP 2005企业WAP网站系统简介
  3. Goreplay来做流量回放
  4. ltsc系统激活_WIN10_X64企业版LTSC 电脑公司装机版 202008
  5. WAIC|高精准、低成本,九章云极DataCanvas突破AutoML难题
  6. Java 8 API Stream让List操作更便捷
  7. python pandas处理无限值inf
  8. 闩锁电流_IGBT——闩锁(Lanchup)效应
  9. protobuf编码原理及其在schema格式转换的应用
  10. 找出2n+1个数中不成对的那个
  11. Jsp+Ssm+Mysql实现的房屋租赁租房管理系统
  12. 睿智的目标检测26——Pytorch搭建yolo3目标检测平台
  13. 微软私有云部署及讲解专题
  14. java实现HTTP的post请求 key-value格式与json格式的区别
  15. ckeditor java 取值_Jquery 对Ckeditor 取值
  16. python 008 __ 小斌文档 | 元组
  17. 外国程序员和中国程序员的区别
  18. 计算机考研复习资料推荐(转载)
  19. ubuntu下安装网易云音乐
  20. 【Devc++】双人跑酷小游戏1.3

热门文章

  1. python 三维地球代码_Python地图可视化三大秘密武器
  2. 通过CTFShow例题掌握爆破方法
  3. Laravel 数据库
  4. 2022P气瓶充装考试试题及在线模拟考试
  5. sofa-bolt是什么?
  6. macOS 更新后 Git 无法工作(xcrun: 错误:无效的活动开发者路径 (/Library/Developer/CommandLineTools)
  7. 计算机近几年自考本科题,近几年自考管理系统中计算机硬应用题汇总.doc
  8. 【知识兔】会计财务最常用的10个公式函数,必须收藏
  9. 人工智能(AI)背后人工的力量——数据标注
  10. nasa注册_“NASA”商标注册案例分析