ocaml: phase 5.1 quickselect.ml baseline (median of 9 elements = 5)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 21s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 21s
Hoare quickselect with Lomuto partition: recursively narrows the
range to whichever side contains the kth index. Mutates the array
in place via .(i)<-v. The median (k=4) of [7;2;9;1;5;6;3;8;4] is 5.
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;
...
end
Exercises array literal syntax + in-place mutation in the same
program, ensuring [|...|] yields a mutable backing.
138 baseline programs total.
This commit is contained in:
@@ -110,6 +110,7 @@
|
|||||||
"prime_factors.ml": 17,
|
"prime_factors.ml": 17,
|
||||||
"pythagorean.ml": 16,
|
"pythagorean.ml": 16,
|
||||||
"queens.ml": 2,
|
"queens.ml": 2,
|
||||||
|
"quickselect.ml": 5,
|
||||||
"quicksort.ml": 44,
|
"quicksort.ml": 44,
|
||||||
"roman.ml": 44,
|
"roman.ml": 44,
|
||||||
"reverse_int.ml": 54329,
|
"reverse_int.ml": 54329,
|
||||||
|
|||||||
25
lib/ocaml/baseline/quickselect.ml
Normal file
25
lib/ocaml/baseline/quickselect.ml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
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
|
||||||
@@ -407,6 +407,13 @@ _Newest first._
|
|||||||
binary search tree (`type 'a tree = Leaf | Node of 'a * 'a tree *
|
binary search tree (`type 'a tree = Leaf | Node of 'a * 'a tree *
|
||||||
'a tree`) with insert + in-order traversal. Tests parametric ADT,
|
'a tree`) with insert + in-order traversal. Tests parametric ADT,
|
||||||
recursive match, List.append, List.fold_left.
|
recursive match, List.append, List.fold_left.
|
||||||
|
- 2026-05-10 Phase 5.1 — quickselect.ml baseline (Hoare quickselect
|
||||||
|
median of [7;2;9;1;5;6;3;8;4] = 5). Lomuto partition scheme:
|
||||||
|
recursively partitions on the last element as pivot, narrows the
|
||||||
|
range to the side containing the kth index. Mutates the array
|
||||||
|
in place via `.(i) <- v`. Verifies that array literal syntax
|
||||||
|
works for in-place mutation paths, not just reads. 138 baseline
|
||||||
|
programs total.
|
||||||
- 2026-05-10 Phase 5.1 — array literals + lis.ml baseline (longest
|
- 2026-05-10 Phase 5.1 — array literals + lis.ml baseline (longest
|
||||||
increasing subsequence on a 9-element array = 6). Added parser
|
increasing subsequence on a 9-element array = 6). Added parser
|
||||||
support for `[| e1; e2; ...; en |]` syntax: desugars to
|
support for `[| e1; e2; ...; en |]` syntax: desugars to
|
||||||
|
|||||||
Reference in New Issue
Block a user