简单对快速排序比较次数效率分析
假设每次选择最后一个为分界点,分开之后,其他元素顺序不被打乱:
加入初始42,4,1,3,先选择3
划分之后,变为左右两个子序列
此时3已固定,分别选择子序列最后一个
第一个子序列需要再划分一次,第二个序列只有一个元素,因此不用做任何事情
假设对n个元素排序,有n!
个,每个序列需要比较 $c_i$ 次,那么总共需要
$$f(n)=\sum_{i=1}^{n}c_i$$
次比较,平均意义上,假设每种序列概率相同,需要
$$g(n)={\sum_{i=1}^{n}c_i \over n!}={f(n) \over n!}$$
假设长度n的序列的所有情况一共需要f(n)次比较,当遇到n+1长的序列时,需要
$$f(n+1)={ {n!*\sum_{i=1}^{n}i} + { \sum_{k=0}^{n}C_{n}^{k}*(f(k)(n-k)! + k!f(n-k)) }}={n*(n+1)! + { 2\sum_{k=0}^{n}C_{n}^{k}*f(n-k)*k!}}$$
而n+2时,需要的次数为
$$f(n+1)={(n+1)(n+2)!} + {2\sum_{k=0}^{n+1}C_{n+1}^{k}*f(n+ 1 -k)*k!}$$
$$={(n+1)(n+2)!} + {2f(n+1)} + {(n+1)(f(n+1)-n(n+1)!}$$
$$={(2n+2)(n+1)!} + {(n+3)f(n+1)} $$
因此
$$f(n+1)={{(n+2)f(n)} + 2n*n!} $$
利用差分方程公式以及初始值$f(1)=0$,可解出
$$f(n+1)=2(n+2)!({1 \over 2} + {1\over 3} + ... + {1\over n+1} - {n \over n+2})$$
即
$$f(n)=2(n+1)!({1 \over 2} + {1\over 3} + ... + {1\over n} - {n-1 \over n+1})$$
$$f(n)=2(n+1)!( \sum_{k=2}^{n}{1 \over k} - {n-1 \over n+1})$$
平均比较次数为:
$$g(n)={f(n) \over n!} = {2(n+1)(\sum_{k=2}^{n}{1 \over k} - {n-1 \over n+1})} \approx 2(n+1)(\int_{1}^{n}{1\over x}dx - {n-1 \over n+1})=2(n+1)ln(n)-2(n-1)$$