快速排序(Quicksort),又称分区交换排序(partition-exchange sort),简称「快排」,是一种被广泛运用的排序算法
原理与实现
- 从数列中挑出一个元素,称为基准(pivot)
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相等的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序
时间复杂度
快速排序的最优时间复杂度和平均时间复杂度为 ,最坏时间复杂度为 。
对于最优情况,每一次选择的分界值都是序列的中位数,此时算法时间复杂度满足的递推式为 ,由主定理,。
对于最坏情况,每一次选择的分界值都是序列的最值,此时算法时间复杂度满足的递推式为 ,累加可得 。
对于平均情况,每一次选择的分界值可以看作是等概率随机的。
快速排序的优化方法:
- 由于在序列基本有序时,最快的排序方法是插入排序,因此,可以在快速排序二分到一定阶段时采用插入排序;
- 基准数的选取越趋于中间位置,二分所构成的二叉树就越趋于平衡。如果基准数是序列最小值或最大值,则会形成极端情况,二叉树均没有左子节点或右子节点。因此,可以选取三个数,即左指针所指数、右指针所指数、中间位置的数值,取这三个数的中位数作为基准数。
代码实现