RosettaCodeData/Task/Quickselect-algorithm/YAMLScript/quickselect-algorithm.ys

26 lines
592 B
Plaintext

!YS-v0
v =: +[9 8 7 6 5 0 1 2 3 4]
defn main():
say:
map \(quickselect v _):
v.#:range
defn quickselect(a k):
loop arr a:V, current-k k:
pivot-idx =: arr.#:rand-int
pivot =: arr.$pivot-idx
remaining =:
concat subvec(arr 0 pivot-idx):
subvec(arr pivot-idx.++)
left =: remaining.filter(\(_ < pivot))
right =: remaining.filter(\(_ >= pivot))
left-count =: left.#
cond:
current-k == left-count: pivot
current-k < left-count:
recur: left:V current-k
else:
recur right:V: (current-k - left-count).--