(* * $Id: heapsort.ocaml,v 1.9 2001/05/08 02:46:59 doug Exp $ * http://www.bagley.org/~doug/shootout/ * with help from Markus Mottl *) let im = 139968 let ia = 3877 let ic = 29573 let last = ref 42 let gen_random max = last := (!last * ia + ic) mod im; max *. float_of_int !last /. float_of_int im let heapsort n ra = let l = ref ((n lsr 1) + 1) and rra = ref 0.0 and i = ref 0 and j = ref 0 and ir = ref n in try while true do if !l > 1 then begin decr l; rra := ra.(!l) end else begin rra := ra.(!ir); ra.(!ir) <- ra.(1); decr ir; if !ir = 1 then begin ra.(1) <- !rra; raise Exit end end; i := !l; j := !l lsl 1; while !j <= !ir do if !j < !ir && ra.(!j) < ra.(!j+1) then incr j; if !rra < ra.(!j) then begin ra.(!i) <- ra.(!j); i := !j; j := !j + !i end else j := !ir + 1; done; ra.(!i) <- !rra; done with Exit -> () let _ = let n = try int_of_string Sys.argv.(1) with Invalid_argument _ -> 1 in let ary = Array.make (n + 1) 0.0 in for i = 1 to n do ary.(i) <- gen_random 1.0 done; heapsort n ary; Printf.printf "%.10f\n" ary.(n)