26 lines
592 B
Plaintext
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).--
|