本文将介绍排序算法中最常用,以及最重要的快速排序。

1 快速排序实例

快速排序由C. A. R. Hoare在1960年提出,是冒泡排序的一种改进。快速排序就跟它的名字一样,效率很快。跟冒泡排序,选择排序相比,它们使用相同的空间大小,但是,快速排序却可以达到O(nlogn)的时间复杂度,比O(n^2)要快上很多。那么,快速排序是怎么做的呢?它的核心思想是,找到一个基准数,让这个基准数到它该去的位置。并且,基准数左边的数都比这个它要小,右边的数都比它要大。根据这个思想,我们每一趟至少能够保证基准数在它应该在的位置,并且右边的数都大于左边的数,整体基本有序。那怎么处理基准数左边和右边两部分的数呢?很简单,分别对左边和右边递归刚刚那个过程,就ok了。这就是快速排序,由于每次都能够排好一个数,并且能够保证左边区域的数只需要在左边区域排序,右边区域的数只需要在右边区域排序,它们本身在该在位置的概率很大,大大降低了需要交换的次数。

我们来看例子,给定数组[4,5,1,10,3,6,9,2],怎么用快速排序对它排序呢?

首先,选择第一个数作为基准数

设置指针i和j,分别指向最左和最右

指针j向左移动,找到第一个小于基准数4的位置。由于指向的2比4小,所以指针j没有移动。

指针i向右移动,找到第一个大于基准数4的位置

交换指针i和j对应的元素

指针j继续向左移动,找到了3比基准数小。

指针i继续向右移动,找到了10比基准数大。

交换指针i和j对应的元素

指针j继续左移,与指针i相遇,停止。

交换指针i与基准数所在位置的元素。

这一趟快速排序结束,基准数4达到了它应该在的位置。而左边都是比4小的数,右边都是比4大的数。接下来我们只需要递归这个过程就可以了。

2 代码解析

49-62行就是刚刚的例子中做的操作,具体在代码注释中已经写明。

66,67行,分别递归处理左边和右边,最终完成整体排序。

这里还有一个问题:为什么每次都要从右边开始找,而不能从左边开始找呢?

如果从左边开始找,那么在这个状态时,i往右一步就停止了。这时候,如果交换基准数和指针i的元素,10会被交换到左边,不符合快速排序“左边的数都比基准数小”的限制。之所以要让指针j先动,就是因为,最后必须停在比基准数小的元素,只有右边先动才可以保证。

3 效率分析

快速排序的效率跟基准数的选择有很大关系。

如果基准数选得好,每次基准数都能够刚好排在中间的位置,递归的时候,两个子问题的大小就是平衡的,不停地二分下去,最终的时间复杂度就是

T(n)=T(n/2)+T(n/2)+O(n)=O(nlogn)

如果基准数选得差,每次基准数刚好是最大值或者最小值,每次子问题的规模只减小了1,这样无疑效率会差很多,最终的时间复杂度为

T(n)=T(n-1)+T(1)+O(n)=O(n^2)

程序填充(指针):3数排序_排序算法之快速排序,它为什么这么快?相关推荐

  1. java sorted排序_【算法】排序算法之计数排序

    前几回,我们已经对冒泡排序.直接插入排序.希尔排序.选择排序.快速排序.归并排序.堆排序做了说明分析.本回,将对计数排序进行相关说明分析. 一.排序算法系列目录说明 冒泡排序(Bubble Sort) ...

  2. c++ 二维数组 排序_【算法】排序算法之计数排序

    前几回,我们已经对[算法]排序算法之冒泡排序.[算法]排序算法之插入排序.[算法]排序算法之希尔排序.[算法]排序算法之选择排序.[算法]排序算法之快速排序.[算法]排序算法之归并排序.[算法]排序算 ...

  3. Java冒泡,快速,插入,选择排序^_^+二分算法查找

    这段时间在学Java,期间学到了一些排序和查找方法.特此写来和大家交流,也方便自己的日后查看与复习. 1.下边是Java的主类: public class Get {public static voi ...

  4. java通过比较大小排序_排序算法的比较与java实现

    冒泡排序 基本思想: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复以上 ...

  5. 降序排序_排序简单,应用不易,使用Excel排序的几点建议

    对数据排序,是数据分析中最基本.最常用也是最重要的分析方法.Excel提供了丰富.简单.灵活的排序方法和排序方式,包括单个排序.组合排序等.对于学习者短时间内掌握Excel的排序,难度不大.问题可能更 ...

  6. python实现快速排序算法_基础算法:快速排序(python实现)

    算法原理 快速排序是一个具有较高性能的排序算法,其主要思想如下: 对数组中的某个元素,确定其在数组中的排序位置,即在其之前的所有元素均小于该元素,在其之后的均大于该元素.对小元素组和大元素组同样执行该 ...

  7. ds排序--希尔排序_排序算法 - 希尔排序分析及优化

    希尔排序 1 算法思想 希尔排序,也被称为递减增量排序,是简单插入排序的一种改进版本. 在插入排序中,如果待排序列中的某个元素,距离有序数列中待插入位置非常远,就需要比较很多次才可以到达插入位置,这是 ...

  8. 倒序排序_排序不等式,切比雪夫不等式及伯努利不等式

    我们比较熟悉的不等式可能就是下面的这个不等式链以及柯西不等式了: 对于不等式链的证明我们可以看下面这张图,非常直观形象: 不太懂得也可以看这个视频讲解: 知乎视频​www.zhihu.com 对于柯西 ...

  9. c++ list排序_排序(二)交换排序

    介绍两种交换排序:冒泡和交换 冒泡排序算法的原理如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是 ...

最新文章

  1. !!!光线对视频识别技术的影响
  2. poj 3207 Ikki's Story IV - Panda's Trick(2-SAT)
  3. 算数运算加法_为什么计算机能“算数”
  4. python的sys.path
  5. On Tutorial with Caffe--a Hands DIY DL for Vision
  6. LeetCode MySQL 626. 换座位
  7. 作者:景志刚(1977-),男,就职于中国人民银行征信中心数据部
  8. TextView赋值int型,并显示
  9. win11更新为何检测不到 Windows11更新检测不到的解决方法
  10. 2022iOS面试题集锦(iOS interview)
  11. MacBook IDEA 下载 安装 配置 使用
  12. 想做一个SSL代理的集群中,有很多问题需要解决,I am all grateful to you for your advice
  13. 2017-2018-2 20155225《网络对抗技术》实验四 恶意代码分析
  14. 做人做事的艺术html,低姿态做人做事的艺术简介读后感,经典语录书评
  15. r7 5700u核显相当于什么显卡 R75700u相当于什么水平
  16. 搭建centos虚拟机
  17. 华为信息中心配置命令,很全
  18. 【异常】java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher异常解决方法
  19. 便宜蜂销售额SPSS预测
  20. autojs脚本引擎开发的的Intent生成器工具源码免费分享开源

热门文章

  1. leetcode 787. Cheapest Flights Within K Stops | 787. K 站中转内最便宜的航班(BFS)
  2. 【JavaScript】请求数据时,添加时间戳,避免浏览器缓存
  3. Java并发容器(一) CocurrentHashMap的应用及实现
  4. Spring Security学习(二)
  5. CSS常用选择器、伪元素选择器、伪类选择器大全——响应式Web系列学习笔记
  6. 1027 Colors in Mars (20 分)_20行代码AC
  7. 38行代码AC——UVA-167The Sultan‘s Successors(八皇后问题,附视频讲解)
  8. 28行代码AC——习题3-12 浮点数(UVA 11809 - Floating-Point Numbers)——解题报告
  9. Centos7 中文乱码切换中英字符
  10. 集群(一)——LVS负载均衡集群