快速排序
快速排序(quicksort)算法和归并排序算法属于分治策略的典型应用, 但是二者有较大区别.
归并排序
的计算量主要消耗在有序子向量的的归并操作上,子向量的划分几乎不花时间。
快速排序
可以在 O ( 1 ) O(1) O(1) 时间内, 由子问题的解直接得到原问题的解, 但是将原问题划分成两个子问题, 需要 O ( n ) O(n) O(n)时间
- 快速排序能够确保划分出的子任务彼此独立, 但是却不能保证两个子任务的规模大体相当(甚至极不平衡)
- 快速排序在最坏情况下不能保证 O ( n l o g n ) O(nlogn) O(nlogn)的复杂度
- 对于随机分布的输入序列,快速排序算法实际的平均运行时间相比同类算法还是要少得多。
1. 轴点 : P i v o t Pivot Pivot
对于一个向量区间 [ l o , h i ) [lo, hi) [lo,hi), 如果对于任意的 l o ≤ m i < h i lo \le mi \lt hi lo≤mi<hi, 以元素 s [ m i ] s[mi] s[mi]为界可以划分出前后两个子向量, s [ l o , m i ) s[lo, mi) s[lo,mi) 和 $s[mi, hi)
$
若 s [ l o , m i ) s[lo, mi) s[lo,mi) 中的元素均不大于 s [ m i ] s[mi] s[mi], 且 s [ m i , h i ) s[mi, hi) s[mi,hi)中的元素均不小于$s[mi]
$
则元素 s [ m i ] s[mi] s[mi] 称作向量 s s s的一个轴点(pivot)
一但轴点左右两个子序列完成了排序,便可在 O ( 1 ) O(1) O(1)时间内完成排序, 得到整个向量的排序结果
2. 快速排序算法:
快速排序算法可以简单地描述为如下形式: (在实际实现时, hi可作为闭区间, 取length-1, 方便实现)
def quick_sort(num_seq