快速排序
快速排序是一种比选择排序更优秀的排序算法,选择排序运行的时间为:$O(n^2)$,而快速排序法的运行时间为:$O(nlog_2n)$,快速排序使用了D&C的思想(一种分而治之的思想)。下面我们来分析快速排序算法。
假设我们使用快速排序算法对数组进行排序,对排序算法来说,最简单的数组是什样子的呢?其实间的数组是不需要排序的数组。
所以,基线条件为数组为空或只包含一个元素,这样只需要返回数组即可。
|
|
如果数组长度为2,只需要将数组的两个元素对调。
如果数组长度为3,那么我们就要使用D&C,将数组做适当的分解,知道满足基线条件,所以首先,需要从数组中选择一个元素,这个元素称之为基准值(pivot)。
假设我们将数组的第一个元素用作基准值,接下来,找出比基准值小的元素以及比基准值大的元素。
这被称作分区(partitioning)。现在我们就有了满足快速排序的一些条件:
- 一个由所有小于基准值的数字组成的子数组;
- 基准值;
- 一个由所有大于基准值的数字组成的子数组;
虽然我们进行了分区,但得到的两个子数组是无序的。当然如果这两个数组是有序的,那对整个数组的排序将非常容易。
如果子数组是有序的,就可以像下面这样合并得到一个有序地数组:左边的数组 + 基准值 +右边的数组。在这里,就是$[10, 15] + [33] + [ ]$,结果为有序数组$[10, 15, 33]$。
现在u,我们需要将两个子数组进行快速排序,在合并结果,就能得到一个有序数组。
|
|
不管选取谁作为基准值,都适用。
总结一下,无论是什么长度的数组,进行快速排序都需要经历下面这几个步骤:
(1) 选择基准值。
(2) 将数组分成两个子数组:小于基准值的元素和大于基准值的元素。
(3) 对这两个子数组进行快速排序。
代码实现
下面我们来写一个快速排序的代码:
|
|
上面是一个python的代码,我们再来写一个Java的:
|
|
上面代码的图解思路:
参考文献
《算法图解》 【美】Aditya Bhargava
欢迎关注:Lvshen’s Blog