let rec quickselect arr lo hi k = if lo = hi then arr.(lo) else begin let pivot = arr.(hi) in let i = ref lo in for j = lo to hi - 1 do if arr.(j) < pivot then begin let t = arr.(!i) in arr.(!i) <- arr.(j); arr.(j) <- t; i := !i + 1 end done; let t = arr.(!i) in arr.(!i) <- arr.(hi); arr.(hi) <- t; if !i = k then arr.(!i) else if !i < k then quickselect arr (!i + 1) hi k else quickselect arr lo (!i - 1) k end ;; let a = [|7; 2; 9; 1; 5; 6; 3; 8; 4|] in quickselect a 0 8 4