19 lines
405 B
Plaintext
19 lines
405 B
Plaintext
def quickselect(a, k)
|
|
arr = a.dup # we will be modifying it
|
|
loop do
|
|
pivot = arr.delete_at(rand(arr.size))
|
|
left, right = arr.partition { |x| x < pivot }
|
|
if k == left.size
|
|
return pivot
|
|
elsif k < left.size
|
|
arr = left
|
|
else
|
|
k = k - left.size - 1
|
|
arr = right
|
|
end
|
|
end
|
|
end
|
|
|
|
v = [9, 8, 7, 6, 5, 0, 1, 2, 3, 4]
|
|
p v.each_index.map { |i| quickselect(v, i) }.to_a
|