前言
排序算法非常多,几乎每个人学的第一个排序算法都是冒泡算法,但是冒泡算法的时间复杂度是很高的,是一种效率很低的算法。而目前来说,快速排序是相对比较好的一种算法:实现难度低,时间复杂度低。但快速排序在一些情况下也可能出现退化到和冒泡算法一样的时间复杂度,所以需要读者注意一下,下面我会讲到。那么接下来就来看看这个算法。
笔者才疏学浅,有不同观点欢迎评论区或私信讨论。如需转载请留言告知。
另外欢迎阅读笔者的个人博客一只修仙的猿的个人博客,更精美的UI,拥有更好的阅读体验。
算法思路
递归算法的思路其实很简单:
- 从数据中取出一个数,即为mid
- 比mid小的数放在左边,比mid大的数放在右边
- 最后把mid放在中间
- 对左右两边的子数组进行递归排序,直到只剩下一个元素则全部排序完成。
具体的实现思路我们举一个例子:
现在有一个数组:

这里细心的读者会发现诶第三个数怎么后面有一点,这个不是手滑打出来的。而是为了证明在排序的过程中,两个3的顺序是否会发生颠倒,从得出这是否是一个稳定的排序。
-
首先我们取出一个数,当成哨兵。这里我们取第一个数
5
当成哨兵。然后我们把这个数和最后一个数交换。为什么需要交换呢?这样我们就不需要去额外设置一个变量存储哨兵了。如图: -
接下来我们设置两个变量:
min
和max
们分别表示比mid小的数的最大的下标,和比mid大的数最小的坐标。举个例子如下图:
-
接下来我们从左边开始,如果
min
指向的数比哨兵小,则min = min+1
,否则则停下来。执行完之后如下图: -
然后从右边开始,如果
max
指向的数大于等于哨兵,则max = max-1
,否则则停下来,执行完成