快速排序算法详细图解

本文介绍了快速排序算法,一种时间复杂度较低的排序方法。通过递归思路,选取一个数作为基准,将数组分为两部分,小于基准的放左边,大于的放右边,再对子数组进行相同操作,直至所有元素排序完成。文章通过实例展示了排序过程,并指出在最坏情况下,时间复杂度可能退化到O(n^2)。同时提供了Java代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

排序算法非常多,几乎每个人学的第一个排序算法都是冒泡算法,但是冒泡算法的时间复杂度是很高的,是一种效率很低的算法。而目前来说,快速排序是相对比较好的一种算法:实现难度低,时间复杂度低。但快速排序在一些情况下也可能出现退化到和冒泡算法一样的时间复杂度,所以需要读者注意一下,下面我会讲到。那么接下来就来看看这个算法。

笔者才疏学浅,有不同观点欢迎评论区或私信讨论。如需转载请留言告知。
另外欢迎阅读笔者的个人博客一只修仙的猿的个人博客,更精美的UI,拥有更好的阅读体验。

算法思路

递归算法的思路其实很简单:

  1. 从数据中取出一个数,即为mid
  2. 比mid小的数放在左边,比mid大的数放在右边
  3. 最后把mid放在中间
  4. 对左右两边的子数组进行递归排序,直到只剩下一个元素则全部排序完成。

具体的实现思路我们举一个例子:

现在有一个数组:

数组

这里细心的读者会发现诶第三个数怎么后面有一点,这个不是手滑打出来的。而是为了证明在排序的过程中,两个3的顺序是否会发生颠倒,从得出这是否是一个稳定的排序。

  1. 首先我们取出一个数,当成哨兵。这里我们取第一个数5当成哨兵。然后我们把这个数和最后一个数交换。为什么需要交换呢?这样我们就不需要去额外设置一个变量存储哨兵了。如图:

    dtjgOI.png
  2. 接下来我们设置两个变量:minmax们分别表示比mid小的数的最大的下标,和比mid大的数最小的坐标。

    举个例子如下图:

    dtjIfg.png
    dtjX7V.png
  3. 接下来我们从左边开始,如果min指向的数比哨兵小,则min = min+1,否则则停下来。执行完之后如下图:

    dtvpp4.png
  4. 然后从右边开始,如果max指向的数大于等于哨兵,则max = max-1,否则则停下来,执行完成

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值