1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
26 """select(pos, seq): find the nth rank ordered element
27 (the least value has rank 0).
28 Note1: it modifies the seq.
29 Note2: this function is useful with Psyco, otherwise .sort is
30 faster until len(seq)>~3e6"""
31
32 lo = 0
33 up = len(seq)-1
34 if pos<lo or pos>up:
35 raise 'Selection out of bounds.'
36 else:
37 while up>=pos and pos>=lo:
38 i = lo
39 j = up
40 tempr = seq[pos]
41 seq[pos] = seq[lo]
42 seq[lo] = tempr
43
44 while i<j:
45 while seq[j] > tempr:
46 j -= 1
47 seq[i] = seq[j]
48 while i<j and seq[i]<=tempr:
49 i += 1
50 seq[j] = seq[i]
51 seq[i] = tempr
52
53 if pos<i:
54 up = i-1
55 else:
56 lo = i+1
57 return seq[pos]
58
59
60 try:
61
62 import psyco
63 except ImportError:
64 pass
65 else:
66 psyco.bind(select)
67
68
69 if __name__ == '__main__':
70 from time import clock
71 import random
72 nrepetiotions = 6
73 print "nrepetiotions=", nrepetiotions
74 print "len(list), average min time select of 1"\
75 "element of list, min time select(list):"
76 for j in xrange(6, 21):
77 n = 2**j
78 v = []
79 for i in range(nrepetiotions):
80 seq = [random.random() for x in xrange(n+1)]
81 nd2 = int(n//2)
82 t1 = clock()
83 select(nd2, seq)
84 t2 = clock()
85 v.append(t2-t1)
86 print "2^"+str(j)+"=", n, round(1000000*min(v)/n, 3), round(min(v), 3)
87