最近突然讨论了这两个问题,有点忘记了,记录了一下网上的比较好的说法,参见Reference
快排的相关知识请参考排序总结
快排的最差情况以及如何避免
首先,快排的最差情况什么时候发生?
1. 已排序
2. 数值全部相等(1的特殊情况)
快排最好的情况是,每次正好中分,复杂度为O(nlogn)。最差情况,复杂度为O(n^2),退化成冒泡排序
为了尽量避免最差情况的发生,就要尽量使每次选择的pivot为中位数。
一般常用的方法是,对每一个数列都取一次中位数(O(n)),这样总体的快排时间复杂度仍为O(nlogn)。
更为简化的方法是,取头、中、尾的中位数(O(1))作为pivot
另一个问题:
如果有元素等于pivot,是换还是不换呢?