快速排序是一种高级排序算法,虽然他的最优时间复杂度是O(nlogn),但是其前面的常数比其他高级排序算法要小,因此比其他高级算法要快很多。
快速排序
快速排序,Quicksort,又称分区交换排序(partition-exchange sort),简称快排,最早由东尼·霍尔提出。
快速排序通常明显比其他算法块,因为它的内部循环可以在大部分的架构上很有效率地达成。
快速排序算法执行流程:
- 挑选基准值:从数列中挑出一个元素,称为“基准”(pivot),
- 分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成,
- 递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。
递归到最底部的判断条件是数列的大小是零或一,此时该数列显然已经有序。
选取基准值有数种具体方法,此选取方法对排序的时间性能有决定性影响。
示意图
使用快速排序法对一列数字进行排序的过程
简单快排基本交换
简单快排最后交换
复杂度
复杂度 | 值 |
---|---|
平均时间复杂度 | O(nlogn) |
最坏时间复杂度 | O(n^2) |
最优时间复杂度 | O(nlogn) |
空间复杂度 | 根据实现的方式不同而不同 |
稳定性 | 不稳定 |
Java实现
1 | public class QuickSort { |
总结
快排是东尼·霍尔提出的一种高级排序算法,主要流程有:选基准、分割、递归排序子序列三个过程。快速排序的平均和最优时间复杂度是O(nlogn),最坏时间复杂度可达O(n^2),是一种不稳定的排序算法。Java 主要排序方法为 java.util.Arrays.sort(),对于原始数据类型使用三向切分的快速排序。