快排及随机算法
- 以下为本人整理课程笔记
- 课程地址:b站搬运
- github:还有除了算法导论外一些基础知识的笔记
快速排序算法
- 分治算法的想法
- 原地排序,不需要额外的空间
步骤
- 分解:通过选定一个特殊值,将原本数组分成两个数组,一个数组比该值小,一个数组比该值大
- 解决:递归调用快速排序,处理分解后的数组
- 合并:原址排序,不需要合并操作
伪代码
QUICKSORT(A,p,r)
if p<r
q = PARTITION(A,p,r)
QUICKSORT(A,p,q-1)
QUICKSORT(A,q+1,r)
PARTITION(A,p,r)
x = A[r]
i=p-1
for j=p to r-1
if A[j]<=x
i = i+1
exchange A[i] with A[j]
exchange A[i+1] with A[j]
return i+1
分析
最坏情况
- 如果输入已经有序,会导致,T(n) = T(0) +T(n-1) +Θ(n)=T(n-1) + Θ(n) = Θ(n^2)
最优情况
- 最平衡的划分,T(n) = 2T(n/2) +Θ(n) = Θ(nlgn)
平均情况
- 只要划分是常数比例的,算法的运行时间总是O(nlgn)
假设平衡划分和不平衡划分交替的情况
-
L(n) = 2U(n/2) + Θ(n)
-
U(n) = L(n-1) +Θ(n)
-
U(n)代入L(n)用主定理求得Θ(nlgn)
保持幸运划分的方法 -随机快速排序
-
随机选取主元
-
运行时间不依赖于输入的顺序
-
无需对输入序列的分布做假设
- 最差情况由随机数生成器决定
RAND-QUICKSORT(A,p,r)
if p<r
q = RAND-PAR(A,p,r)
RAND-QUICKSORT(A,p,q-1)
RAND-QUICKSORT(A,q+1,r)
RAND-PAR(A,p,r)
i = RANDOM(p,r)
exchange A[r] with A[i]
return PARTITION(A,p,r)
PARTITION(A,p,r)
x = A[r]
i=p-1
for j=p to r-1
if A[j]<=x
i = i+1
exchange A[i] with A[j]
exchange A[i+1] with A[j]
return i+1
分析
- 令T(n) 为运行时间的随机变量,假设这些随机数是独立的,即选择的时间是独立的
- 该随机变量的名字叫做指示器随机变量,使概率等于期望值
- 推导公式很有意思 - 》视频的51分钟开始推导
时间的随机变量,假设这些随机数是独立的,即选择的时间是独立的- 该随机变量的名字叫做指示器随机变量,使概率等于期望值
- 推导公式很有意思 - 》视频的51分钟开始推导
- 递归式求解【理解能更上,计算跟不上】