def short_find(a, rank):
a.sort()
return a[rank - 1]
# Find the rank'th-smallest value in a, in worst-case linear time.
def find(a, rank):
n = len(a)
assert 1 <= rank <= n
if n <= 7:
return short_find(a, rank)
# Find median of median-of-7's.
medians = [short_find(a[i : i+7], 4) for i in xrange(0, n-6, 7)]
median = find(medians, (len(medians) + 1) // 2)
# Partition around the median.
# a[:i] <= median
# a[j+1:] >= median
i, j = 0, n-1
while i <= j:
while a[i] < median:
i += 1
while a[j] > median:
j -= 1
if i <= j:
a[i], a[j] = a[j], a[i]
i += 1
j -= 1
if rank <= i:
return find(a[:i], rank)
else:
return find(a[i:], rank - i)
a.sort()
return a[rank - 1]
# Find the rank'th-smallest value in a, in worst-case linear time.
def find(a, rank):
n = len(a)
assert 1 <= rank <= n
if n <= 7:
return short_find(a, rank)
# Find median of median-of-7's.
medians = [short_find(a[i : i+7], 4) for i in xrange(0, n-6, 7)]
median = find(medians, (len(medians) + 1) // 2)
# Partition around the median.
# a[:i] <= median
# a[j+1:] >= median
i, j = 0, n-1
while i <= j:
while a[i] < median:
i += 1
while a[j] > median:
j -= 1
if i <= j:
a[i], a[j] = a[j], a[i]
i += 1
j -= 1
if rank <= i:
return find(a[:i], rank)
else:
return find(a[i:], rank - i)