7 e! J: U6 s9 g( u* j$ B1 d" tif (j - l + 1 < k) + Y( j$ C/ ~1 n: r7 f3 B C6 h( B/ A6 e
return select(a, j+1, r, k-j+l-1);0 x) ~ W; s/ l7 t3 `+ E
, I+ u& v& {& r0 H- jelse return select(a, l, j-1, k);/ K3 w& W5 b+ A9 k, z3 h% Y
& f% u6 U" E- ]5 u, ?$ @1 @7 n# B
}4 O0 {$ M* P7 o( a+ n
; F9 p) n5 ^" x" z2 p
程序1 4 - 7在最坏情况下的复杂性是( n2 ),此时left 总是为空,而且第k个元素总是位于r i g h t.' |; @2 ^) Y8 ?. y
2 f* [. S' t" y6 [' K
如果假定n 是2的幂,则可以取消公式(2 - 1 0)中的向下取整操作符。通过使用迭代方法,可以得到t (n) = (n)。若仔细地选择支点元素,则最坏情况下的时间开销也可以变成(n)。一种选择支点元素的方法是使用“中间的中间( m e d i a n - o f - m e d i a n)”规则,该规则首先将数组a中的n 个元素分成n/r 组,r 为某一整常数,除了最后一组外,每组都有r 个元素。然后通过在每组中对r 个元素进行排序来寻找每组中位于中间位置的元素。最后根据所得到的n/r 个中间元素,递归使用选择算法,求得所需要的支点元素。 , f {; ]- j& z( V* u. l 6 a7 Z, I) g& n8 r- ?- W9 x3 [例2-6 [中间的中间] 考察如下情形:r=5, n=27, 并且a= [ 2,6,8,1,4,1 0,2 0,6,2 2,11,9,8,4,3,7,8,1 6,11,1 0,8,2,1 4,1 5,1,1 2,5,4 ]。这2 7个元素可以被分为6组[ 2 , 6 , 8 , 1 , 4 ],[ 1 0 , 2 0 , 6 , 2 2 , 11 ],[ 9 , 8 , 4 , 3 , 7 ],[ 8 , 1 6 , 11 , 1 0 , 8 ],[ 2 , 1 4 , 1 5 , 1 , 1 2 ]和[ 5 , 4 ],每组的中间元素分别为4 , 11 , 7 , 1 0 , 1 2和4。[ 4 , 11 , 7 , 1 0 , 1 2 , 4 ]的中间元素为7。这个中间元素7被取为支点元素。由此可以得到l e ft= [ 2 , 6 , 1 , 4 , 6 , 4 , 3 , 2 , 1 , 5 , 4 ],m i d d l e= [ 7 ] ,r i g h t= [ 8 , 1 0 , 2 0 , 2 2 , 11 , 9 , 8 , 8 , 1 6 , 11 , 1 0 , 8 , 1 4 , 1 5 , 1 2 ]。$ ?; R) C0 f/ P# v! A
' N5 I {; ^& [: J% K如果要寻找第k个元素且k< 1 2,则仅仅需要在l e f t中寻找;如果k= 1 2,则要找的元素就是支点元素;如果k> 1 2,则需要检查r i g h t中的1 5个元素。在最后一种情况下,需在r i g h t中寻找第(k- 1 2 )个元素。, N2 J8 v6 ?2 h+ w; I
4 L8 Y1 s+ X% `- P定理2-2 当按“中间的中间”规则选取支点元素时,以下结论为真: ) ?$ m3 u$ A- }0 A 7 o. U, D% {$ `; x6 {0 Z1 \# |, K# h1) 若r=9, 那么当n≥9 0时,有m a x { |l e f e|, |r i g h t| }≤7n / 8。 D$ e) [9 _4 _4 O( G/ _, ~
/ }0 Q! a! f7 e9 a7 V! r3 ?1 i6 P% q2) 若r= 5,且a 中所有元素都不同,那么当n≥2 4时,有max{| left |, | right | }≤3n/ 4。 $ Q6 B' i" t6 R9 l2 j, e# J- }6 S b* d
证明这个定理的证明留作练习2 3。 8 m7 k. Y# p: o3 Y # I g" H, k0 S1 E0 }根据定理2 - 2和程序1 4 - 7可知,如果采用“中间的中间”规则并取r= 9,则用于寻找第k个元素的时间t (n)可按如下递归公式来计算: - X) h/ ?' |# |! A2 x. n 7 J( C7 k9 Q5 D0 h5 \7 r* c在上述递归公式中,假设当n<9 0时使用复杂性为nl o gn的求解算法,当n≥9 0时,采用“中间的中间”规则进行分而治之求解。利用归纳法可以证明,当n≥1时有t (n)≤7 2cn (练习2 4 )。 ( f6 g$ r* S4 C6 x. c0 g " h- T2 K" Y1 T2 [0 e当元素互不相同时,可以使用r= 5来得到线性时间性能。</P>