如何渐近分析冒泡排序的轮数的期望值?

∑ k = 1 n k ! k n − k n ! \sum_{k = 1}^{n}{\frac{k!k^{n-k}}{n!}} k=1nn!k!knk 的渐进分析

已经有了很好的回答,在这里我只想谈谈

n + 1 − ∑ k = 1 n k ! k n − k n ! n+1-\sum_{k = 1}^{n}{\frac{k!k^{n-k}}{n!}} n+1k=1nn!k!knk 是怎么来的

根据计算机程序设计艺术卷3:排序与查找(第二版) Donald E. Knuth著 贾洪峰译 人民邮电出版社 第84页的解说,我们实际上只需要理解为什么当 1 ≤ k ≤ n 1 \leq k \leq n 1kn 时所有分量均小于 k k k 的反序表数目是

k ! k n − k k!k^{n-k} k!knk 其实非常简单,由上面提到的著作第8页给出的不等式 0 ≤ b 1 ≤ n − 1 0 \leq b_{1} \leq n-1 0b1n1

0 ≤ b 2 ≤ n − 2 − − − − − 0 ≤ b n − 1 ≤ 1 b n = 0 0 \leq b_{2} \leq n-2 ----- 0 \leq b_{n-1} \leq 1 b_{n} = 0 0b2n20bn11bn=0

b 1 b_{1} b1 0 − − − k − 1 0---k-1 0k1 k k k 种选择, b 2 b_{2} b2 同样有 0 − − − k − 1 这 k 0---k-1 这 k 0k1k 种选择,-------

b n − k b_{n-k} bnk 同样有 0 − − − k − 1 0---k-1 0k1 k k k 种选择,

再往下 b n − k + 1 b_{n-k + 1} bnk+1 0 − − − k − 1 0---k-1 0k1 k k k 种选择, b n − k + 2 b_{n-k+2} bnk+2 0 − − − k − 2 0---k-2 0k2 k − 1 k-1 k1 种选择

b n − k + 3 b_{n-k+3} bnk+3 0 − − − k − 3 0---k-3 0k3 k − 2 k-2 k2 种选择—以此类推 b n − 1 b_{n-1} bn1 有2种选择, b n b_{n} bn 有1种选择,从而由乘法原理总共有 k ! k n − k k!k^{n-k} k!knk 种选择,故当 1 ≤ k ≤ n 1 \leq k \leq n 1kn 时所有分量均小于 k 的反序表数目是

k ! k n − k k!k^{n-k} k!knk有了这一结论其他也就不难理解了

另一种证明思路

设待排序序列为 A , A A , A A,A 的长度 n ≥ 2 n \geq2 n2 , A A A 中元素按从小到大的顺序排序为 S = [ S 1 , S 2 , − − − , S n ] S 1 < S 2 < − − − < S n S=[S1,S2,---,Sn] S1<S2<---<Sn S=[S1,S2,,Sn]S1<S2<<Sn

现考虑按从小到大的顺序排序元素的冒泡排序算法。我们用 1 , 2 , 3 , − − − , n 1,2,3,---,n 1,2,3,,n 分别索引被排序元素所处的 n n n 个槽位,初始时, A A A n n n 个元素分别位于槽位 1 , 2 , 3 , − − − , n 1,2,3,---,n 1,2,3,,n 上,记 P k ( i , j ) P_{k}(i,j) Pk(i,j) 为第 k 轮冒泡排序后 S i S_{i} Si 位于槽位 j j j 上的概率

由于排序的初始序列 A A A 可以被认为是随机给定的,所以 S i 1 < = i < = n Si 1<=i<=n Si1<=i<=n 恰位于槽位 j ( 1 < = j < = n ) j ( 1<=j<=n ) j(1<=j<=n)上的概率 P 0 ( i , j ) P_{0}(i,j) P0(i,j) 1 n \frac{1}{n} n1 (1)

考虑冒泡排序第 k 轮排序前( 1 < = k < = n − 1 1<=k<=n-1 1<=k<=n1 )的状态,此时槽位 n − k + 2 n-k+2 nk+2 n n n 上的元素从小到大排序,恰为 A A A 的前 k − 1 k-1 k1 大的数,而槽位 1 1 1 n − k + 1 n-k+1 nk+1 上的元素则可能处于无序状态,由数学归纳法和(1),现在在 P k − 1 ( i , j ) ( 1 ≤ i ≤ n − k + 11 ≤ j ≤ n − k + 1 ) P_{k-1}(i,j)( 1\leq i \leq n-k+1 1\leq j \leq n-k+1 ) Pk1(i,j)(1ink+11jnk+1) 已经求出的情况下计算 P k ( i , j ) ( 1 ≤ i ≤ n − k 1 ≤ j ≤ n − k ) P_{k}(i,j) ( 1 \leq i \leq n-k 1 \leq j \leq n-k ) Pk(i,j)(1ink1jnk)

事实上

P k ( i , j ) = ( 1 − ∑ s = j + 2 n − k + 1 P k − 1 ( i , s ) ) [ P k − 1 ( i , j ) ∗ ∏ m = 1 j − 1 ∑ q = 1 i − 1 P k − 1 ( q , m ) ∗ ∑ s = i + 1 n − k + 1 P k − 1 ( s , j + 1 ) + ( ∑ s = 1 j − 1 ( P k − 1 ( i , s ) ∗ ∏ m = 1 , m ≠ s j ∑ q = 1 i − 1 P k − 1 ( q , m ) ) ) ∗ ∑ s = i + 1 n − k + 1 P k − 1 ( s , j + 1 ) + P k − 1 ( i , j + 1 ) ( 1 − ∏ m = 1 j ∑ q = 1 i − 1 P k − 1 ( q , m ) ) ] P_{k}(i,j) = (1-\sum_{s = j + 2}^{n-k+1}{P_{k-1}(i,s)}) [P_{k-1}(i,j)*\prod_{m=1}^{j-1}\sum_{q = 1}^{i-1}{P_{k-1}(q,m)}*\sum_{s = i+1}^{n-k+1}{P_{k-1}(s,j+1)}+(\sum_{s = 1}^{j-1}({P_{k-1}(i,s)}*\prod_{m=1,m\ne s}^{j}\sum_{q=1}^{i-1}{P_{k-1}(q,m)}))*\sum_{s=i+1}^{n-k+1}{P_{k-1}(s,j+1)}+P_{k-1}(i, j+1)(1-\prod_{m=1}^{j}\sum_{q = 1}^{i-1}{P_{k-1}(q,m)})] Pk(i,j)=(1s=j+2nk+1Pk1(i,s))[Pk1(i,j)m=1j1q=1i1Pk1(q,m)s=i+1nk+1Pk1(s,j+1)+(s=1j1(Pk1(i,s)m=1,m=sjq=1i1Pk1(q,m)))s=i+1nk+1Pk1(s,j+1)+Pk1(i,j+1)(1m=1jq=1i1Pk1(q,m))]

(2)

注意, j + 2 > n − k + 1 j+2 > n-k + 1 j+2>nk+1 ∑ s = j + 2 n − k + 1 P k − 1 ( i , s ) = 0 \sum_{s = j + 2}^{n-k+1}{P_{k-1}(i,s)} = 0 s=j+2nk+1Pk1(i,s)=0

j = 1 j=1 j=1 ∏ m = 1 j − 1 ∑ q = 1 i − 1 P k − 1 ( q , m ) = 1 \prod_{m=1}^{j-1}\sum_{q = 1}^{i-1}{P_{k-1}(q,m)} = 1 m=1j1q=1i1Pk1(q,m)=1

j = 1 j=1 j=1 ( ∑ s = 1 j − 1 ( P k − 1 ( i , s ) ∗ ∏ m = 1 , m ≠ s j ∑ q = 1 i − 1 P k − 1 ( q , m ) ) ) = 0 (\sum_{s = 1}^{j-1}({P_{k-1}(i,s)}*\prod_{m=1,m\ne s}^{j}\sum_{q=1}^{i-1}{P_{k-1}(q,m)})) = 0 (s=1j1(Pk1(i,s)m=1,m=sjq=1i1Pk1(q,m)))=0

i = 1 i = 1 i=1 ∑ q = 1 i − 1 P k − 1 ( q , m ) = 0 \sum_{q=1}^{i-1}{P_{k-1}(q,m)} = 0 q=1i1Pk1(q,m)=0

于是第 k 轮排序后 S i Si Si 1 < = i < = n − k 1<=i<=n-k 1<=i<=nk落到槽位 j ( 1 < = j < = n − k 1<=j<=n-k 1<=j<=nk )上的概率为 P k ( i , j ) P_{k}(i,j) Pk(i,j)

现考虑第k轮排序,记事件 B i k B_{i}^{k} Bik 表示第k轮排序完成后 S i Si Si 恰位于槽位 i 上( 1 < = i < = n − k 1<=i<=n-k 1<=i<=nk )

记事件 C k C^{k} Ck 表示第k轮排序完成后 1 , 2 , − − − , n − k 1,2,---,n-k 1,2,,nk 槽位上的元素完全有序(从小到大)

P ( C k ) = P ( B 1 k B 2 k − − − B n − k k ) P(C^{k}) = P(B_{1}^{k}B_{2}^{k}---B_{n-k}^{k}) P(Ck)=P(B1kB2kBnkk)

= P ( B 1 k ) P ( B 2 k ∣ B 1 k ) − − − P ( B n − k k ∣ B 1 k − − − B n − k − 1 k ) =P(B_{1}^{k})P(B_{2}^{k}|B_{1}^{k})---P(B_{n-k}^{k}|B_{1}^{k}---B_{n-k-1}^{k}) =P(B1k)P(B2kB1k)P(BnkkB1kBnk1k)

注意到 P ( B n − k k ∣ B 1 k − − − B n − k − 1 k ) = 1 P(B_{n-k}^{k}|B_{1}^{k}---B_{n-k-1}^{k}) =1 P(BnkkB1kBnk1k)=1 P ( C k ) = P ( B 1 k ) P ( B 2 k ∣ B 1 k ) − − − P ( B n − k − 1 k ∣ B 1 k − − − B n − k − 2 k ) P(C^{k}) = P(B_{1}^{k})P(B_{2}^{k}|B_{1}^{k})---P(B_{n-k-1}^{k}|B_{1}^{k}---B_{n-k-2}^{k}) P(Ck)=P(B1k)P(B2kB1k)P(Bnk1kB1kBnk2k)

现在我们来计算 P ( B m k ∣ B 1 k − − − B m − 1 k ) 2 < = m < = n − k − 1 P(B_{m}^{k}|B_{1}^{k}---B_{m-1}^{k}) 2<=m<=n-k-1 P(BmkB1kBm1k)2<=m<=nk1

如果事件 B 1 k − − − B m − 1 k B_{1}^{k}---B_{m-1}^{k} B1kBm1k 发生,即第 k 轮排序结束后 S 1 − − − S m − 1 S1---Sm-1 S1Sm1 分别位于槽位 1 , 2 , − − − , m − 1 1,2,---,m-1 1,2,,m1 上 对冒泡排序而言,在第 k 轮排序中,当槽位 m − 1 m-1 m1 m m m 上的元素比较交换完成后,前 m − 1 m-1 m1 个槽位上的元素就完全确定了,和第k轮排序完成后的结果一致,恰为前 m − 1 m-1 m1 小的元素(由小到大排列),故此时要使 B m k B_{m}^{k} Bmk 发生,则 S m Sm Sm 必须位于槽位 m m m m + 1 m+1 m+1

S m Sm Sm 位于槽位 m m m 上时, m + 1 m+1 m+1 上的元素 S m + 1 ′ S_{m+1}^{'} Sm+1 必须大于 S m Sm Sm (3)

S m Sm Sm 位于 m + 1 m+1 m+1 上时, m m m 上的元素 S m ′ S_{m}^{'} Sm 必须大于 S m Sm Sm (4)(以上论断的正确性请读者自己思考)

不难看出(3)自动成立,这是因为此时槽位 1 , − − − , m − 1 1,---,m-1 1,,m1 由前 m − 1 m-1 m1 小的元素占据,从而槽位 m , m + 1 , − − − , n − k m,m+1,---,n-k m,m+1,,nk上排列着第 m , m + 1 , − − − , n − k m,m+1,---,n-k m,m+1,,nk 小的元素,故此时当 S m Sm Sm 位于槽位 m m m 上时,槽位 m + 1 m+1 m+1 上的元素 S m + 1 ′ S_{m+1}^{'} Sm+1 只能是第 m + 1 m+1 m+1 小或第 m + 2 m+2 m+2 小—或第 n − k n-k nk 小元素,从而必有 S m + 1 ′ > S m S_{m+1}^{'}>Sm Sm+1>Sm (5)

类似的不难看出(4)自动成立 (6)

另外此时由(2) S m Sm Sm 位于槽位 m + 1 m+1 m+1 位置的概率为 P k − 1 ( m , m + 1 ) P_{k-1}(m, m+1) Pk1(m,m+1) , 而 S m Sm Sm 位于 m m m 位置的概率为 ∑ q = 1 m P k − 1 ( m , q ) \sum_{q = 1}^{m}{P_{k-1}(m,q)} q=1mPk1(m,q)

由(5)当 S m Sm Sm 位于槽位 m m m 上时, m + 1 m+1 m+1 上的元素 S m + 1 ′ S_{m+1}^{'} Sm+1 大于 S m Sm Sm

的概率为 1

而由(6)当 S m Sm Sm 位于 m + 1 m+1 m+1 上时,槽位 m m m 上的 S m ′ > S m S_{m}^{'} > Sm Sm>Sm 的概率为 1

P ( B m k ∣ B 1 k − − − B m − 1 k ) = ∑ q = 1 m P k − 1 ( m , q ) ∗ 1 + P k − 1 ( m , m + 1 ) ∗ 1 P(B_{m}^{k}|B_{1}^{k}---B_{m-1}^{k}) = \sum_{q = 1}^{m}{P_{k-1}(m,q)}*1+P_{k-1}(m, m+1)*1 P(BmkB1kBm1k)=q=1mPk1(m,q)1+Pk1(m,m+1)1 (7)

注意当 m = 1 m=1 m=1 时(7)依然成立

这样我们有 P ( C k ) = ∏ m = 1 n − k − 1 ( ∑ q = 1 m P k − 1 ( m , q ) + P k − 1 ( m , m + 1 ) ) P(C^{k})=\prod_{m=1}^{n-k-1}(\sum_{q = 1}^{m}{P_{k-1}(m,q)}+P_{k-1}(m, m+1)) P(Ck)=m=1nk1(q=1mPk1(m,q)+Pk1(m,m+1)) (8)

P ( 排序轮数恰为 i 轮 ) = ∏ k = 1 i − 1 ( 1 − P ( C k ) ) P ( C i ) P(排序轮数恰为i轮)=\prod_{k=1}^{i-1}(1-P(C^{k}))P(C^{i}) P(排序轮数恰为i)=k=1i1(1P(Ck))P(Ci) (9)

冒泡排序排序轮数的期望次数 E = ∑ i = 1 n − 1 i P ( 排序轮数恰为 i 轮 ) E=\sum_{i=1}^{n-1}{iP(排序轮数恰为i轮)} E=i=1n1iP(排序轮数恰为i) (10)

注意,(9)式中 i = 1 i=1 i=1 ∏ k = 1 i − 1 ( 1 − P ( C k ) ) = 1 \prod_{k=1}^{i-1}(1-P(C^{k})) =1 k=1i1(1P(Ck))=1

(8)式中 k = n − 1 k=n-1 k=n1 时(8)式即为 1

联立(8)(9)(10)式可得冒泡排序轮数期望值的展开式,但该展开式的渐进分析比较繁琐困难,也不是本文的重点,有兴趣的读者可以尝试以下分析该展开式的渐进表达式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值