Advertisement
Guest User

Merge Sort in F#

a guest
Jul 26th, 2010
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 0.87 KB | None | 0 0
  1. let split l =
  2.   let rec split l left right =
  3.     match l, right with
  4.     | [], _ -> List.rev left, right
  5.     | [_], _ -> List.rev left, right
  6.     | _::_::t, h::right_t -> split t (h::left) right_t
  7.     | _ -> failwith "Error"
  8.   in
  9.     split l [] l
  10.    
  11.    
  12. let rec rev_add a b =
  13.   match a with
  14.     | [] -> b
  15.     | h::t -> rev_add t (h::b)
  16.    
  17.    
  18. let merge cmp left right =
  19.   let rec merge cmp left right acc =
  20.     match left, right with
  21.     | [], l -> rev_add acc l
  22.     | l, [] -> rev_add acc l
  23.     | left_h::left_t, right_h::right_t ->
  24.         if cmp right_h left_h then
  25.           merge cmp left right_t (right_h::acc)
  26.         else
  27.           merge cmp left_t right (left_h::acc)
  28.   in
  29.     merge cmp left right []
  30.    
  31.    
  32. let rec merge_sort cmp l =
  33.   match split l with
  34.   | [], h1 -> h1
  35.   | l1, l2 -> merge cmp (merge_sort cmp l1) (merge_sort cmp l2)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement