forked from arin2002/Hacktoberfest-2022
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathselection_deter.py
More file actions
31 lines (27 loc) · 805 Bytes
/
selection_deter.py
File metadata and controls
31 lines (27 loc) · 805 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# selection problem solved deterministically
from sorting import mergesort
def median_of_medians(a):
n = len(a)
p = range(0, n, 5) + [n]
sublist = [a[p[i]:p[i+1]] for i in range(len(p)-1)]
mergelist = [mergesort(s)[len(s)/2] for s in sublist]
# TODO: make this call recursive
return mergelist[len(mergelist)/2]
def select(a, i):
""" returns the ith order statistic in array a
in linear time."""
if i < 1 or i > len(a):
return None
if len(a) <= 1: return a
# choose pivot
p = median_of_medians(a)
# partioning
lesser = [x for x in a if x < p]
greater = [x for x in a if x > p]
j = len(lesser)
if j == i:
return p
elif i < j:
return select(lesser, i)
else: # i > j
return select(greater, i-j)