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
