mirror of
https://github.com/c-cube/moonpool.git
synced 2025-12-12 14:00:41 -05:00
test: add a parallel quicksort
This commit is contained in:
parent
03212e7478
commit
0f383e877a
2 changed files with 69 additions and 1 deletions
|
|
@ -1,6 +1,6 @@
|
|||
|
||||
(tests
|
||||
(names t_fib1 t_futs1 t_many t_fork_join t_fork_join_all)
|
||||
(names t_fib1 t_futs1 t_many t_fork_join t_fork_join_all t_sort)
|
||||
(enabled_if (>= %{ocaml_version} 5.0))
|
||||
(libraries moonpool trace ;tracy-client.trace
|
||||
))
|
||||
|
|
|
|||
68
test/await/t_sort.ml
Normal file
68
test/await/t_sort.ml
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
open Moonpool
|
||||
|
||||
let rec select_sort arr i len =
|
||||
if len >= 2 then (
|
||||
let idx = ref i in
|
||||
for j = i + 1 to i + len - 1 do
|
||||
if arr.(j) < arr.(!idx) then idx := j
|
||||
done;
|
||||
let tmp = arr.(!idx) in
|
||||
arr.(!idx) <- arr.(i);
|
||||
arr.(i) <- tmp;
|
||||
select_sort arr (i + 1) (len - 1)
|
||||
)
|
||||
|
||||
let sorted arr =
|
||||
try
|
||||
for i = 0 to Array.length arr - 2 do
|
||||
if arr.(i) > arr.(i + 1) then (
|
||||
Printf.printf "not sorted at %d\n%!" i;
|
||||
raise Exit
|
||||
)
|
||||
done;
|
||||
true
|
||||
with Exit -> false
|
||||
|
||||
let () =
|
||||
let arr = [| 4; 2; 1; 5; 1; 10; 3 |] in
|
||||
select_sort arr 0 (Array.length arr);
|
||||
assert (sorted arr)
|
||||
|
||||
let rec quicksort arr i len : unit =
|
||||
if len <= 10 then
|
||||
select_sort arr i len
|
||||
else (
|
||||
let pivot = arr.(i + (len / 2)) in
|
||||
let low = ref (i - 1) in
|
||||
let high = ref (i + len) in
|
||||
|
||||
while !low < !high do
|
||||
incr low;
|
||||
decr high;
|
||||
while arr.(!low) < pivot do
|
||||
incr low
|
||||
done;
|
||||
while arr.(!high) > pivot do
|
||||
decr high
|
||||
done;
|
||||
if !low < !high then (
|
||||
let tmp = arr.(!low) in
|
||||
arr.(!low) <- arr.(!high);
|
||||
arr.(!high) <- tmp
|
||||
)
|
||||
done;
|
||||
|
||||
Fork_join.both_ignore
|
||||
(fun () -> quicksort arr i (!low - i))
|
||||
(fun () -> quicksort arr !low (len - (!low - i)))
|
||||
)
|
||||
|
||||
let pool = Moonpool.Pool.create ~min:8 ()
|
||||
|
||||
let () =
|
||||
let arr = Array.init 400_000 (fun _ -> Random.int 300_000) in
|
||||
Fut.spawn ~on:pool (fun () -> quicksort arr 0 (Array.length arr))
|
||||
|> Fut.wait_block_exn;
|
||||
(* Printf.printf "arr: [%s]\n%!" *)
|
||||
(* (String.concat ", " @@ List.map string_of_int @@ Array.to_list arr); *)
|
||||
assert (sorted arr)
|
||||
Loading…
Add table
Reference in a new issue