Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- fn {a : vt@ype}
- insertion_position
- {p_arr : addr}
- {n : int}
- {i : pos | i < n}
- (pf_arr : !array_v (a, p_arr, n) |
- bp_arr : bptr_anchor (a, p_arr),
- bp_i : bptr (a, p_arr, i))
- :<> [j : nat | j <= i]
- bptr (a, p_arr, j) =
- (*
- A binary search.
- References:
- * H. Bottenbruch, "Structure and use of ALGOL 60", Journal of
- the ACM, Volume 9, Issue 2, April 1962, pp.161-221.
- https://doi.org/10.1145/321119.321120
- The general algorithm is described on pages 214 and 215.
- * https://en.wikipedia.org/w/index.php?title=Binary_search_algorithm&oldid=1062988272#Alternative_procedure
- *)
- let
- fun
- loop {j, k : int | 0 <= j; j <= k; k < i}
- .<k - j>.
- (pf_arr : !array_v (a, p_arr, n) |
- bp_j : bptr (a, p_arr, j),
- bp_k : bptr (a, p_arr, k))
- :<> [j1 : nat | j1 <= i]
- bptr (a, p_arr, j1) =
- if bp_j <> bp_k then
- let
- (* Find the point that is halfway between bp_j and bp_k,
- rounding towards bp_k. *)
- stadef h = k - ((k - j) / 2)
- val bp_h : bptr (a, p_arr, h) =
- bp_k - (half (bp_k - bp_j))
- in
- if elem_lt<a> (pf_arr | bp_i, bp_h) then
- loop (pf_arr | bp_j, pred bp_h)
- else
- loop (pf_arr | bp_h, bp_k)
- end
- else if bp_j <> bp_arr then
- succ bp_j
- else if elem_lt<a> (pf_arr | bp_i, bp_arr) then
- bp_arr
- else
- succ bp_arr
- in
- loop (pf_arr | bp_arr, pred bp_i)
- end
Advertisement
Add Comment
Please, Sign In to add comment