快速排序
-
快排1.0 )【 】
- 用最后一个数作标准
- 将数组除了最后一个数分成小于等于区域和大于区域
- 再将最后一个数与大于区域的第一个数作交换
- 则标准后的所有数一定都大于标准
- 对标准左右的区域重复作递归,每次递归都能保证一个数被排号
-
快排2.0 利用荷兰国旗问题 )【 】(
-
同样用最后一个数作标准
-
将其他数分为小于等于大于三个区域
-
再将最后一个数与大于区域第一个数做交换
-
则每次保证等于区域的那一批数有序,进行递归
-
不管是2.0还是1.0复杂度都是N2
-
最坏的情况是数组已经排好序了,每次都只有一个左侧部分,每次都只排好一个数
-
-
快排3.0:O(NlogN),O(logN)
- 最坏情况产生的原因是划分值打的很偏,递归子问题的规模差很多,逐渐退化成N2,最差就是排好序,或者完全逆序
- 原因是总是拿数组的最后一个数作划分,可以人为构造差的例子
- 3.0随机选一个数,与最后一个数作交换,作为划分标准,好情况和坏情况变成概率事件
- 数学证明,期望是NlogN
快排的额外空间复杂度时O(logN),也是通过期望得出的
最坏情况是需要开n个递减数列的额外空间,额外空间复杂度是O(N)水平的
最好情况下,近似二叉树的展开,额外空间复杂度是O(logN)水平