QuickSort
快速排序(Quicksort),又称分区交换排序(partition-exchange sort),简称快排,是一种高效的排序算法。由英国计算机科学家 Tony Hoare 于 1959 年开发并于 1961 年发表,至今它仍然是一种常用的排序算法。事实上,如果实施得当,它可以比归并排序、堆排序快两到三倍。
快速排序(Quicksort)
基本原理
快速排序是图灵奖得主 C. R. A. Hoare 于 1960 年提出的一种划分交换排序,它采用了一种分治的策略,通常称其为 分治法(Divide-and-ConquerMethod)。
分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地求解这些子问题,然后将这些子问题的解组合为原问题的解。
算法步骤
- 从序列中挑出一个元素,作为"基准" (pivot)
- 把所有比基准值小的元素放在基准前面,所有比基准值大的元素放在基准值的后面(相同的数可以放到任一边),这个操作称为分区 (partition) 操作,分区操作结束后,基准元素所处的位置就是最终排序后它的位置
- 递归地把小于基准值元素的子数列和大于基准值元素的子数列排序,直到所有子序列的大小为 0 或 1,这时整体已经排好序了
算法图解
传送门 坐在马桶上看算法:快速排序
动画演示
参考实现
1 | import java.util.Arrays; |
partition的另一种写法,选取最右元素作为基准
1 | public static int partition2(int[] arr, int left, int right) { |
复杂度分析
排序算法 | 平均时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 | 排序方式 | 稳定性 |
---|---|---|---|---|---|---|
快速排序 | \(O(nlogn)\) | \(O(nlogn)\) | \(O(n^2)\) | \(O(logn) \sim O(n)\) | In-place | 不稳定 |
References
https://en.wikipedia.org/wiki/Quicksort