Advertisement
Guest User

Merge Sort

a guest
Feb 7th, 2017
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (* merge: int list * int list -> int list
  2.   REQUIRES: A and B are sorted
  3.   ENSURES: merge(A,B) is a sorted permutation of A@B
  4. *)
  5. fun merge([] : int list, B : int list) : int list = B
  6.   | merge(A, []) = A
  7.   | merge(x::xs, y::ys) =
  8.     case Int.compare(x, y) of
  9.       LESS => x::merge(xs, y::ys)
  10.     | GREATER => y::merge(x::xs, ys)
  11.     | EQUAL => x::y::merge(xs, ys)
  12.  
  13. (* split : int list -> int list * int list
  14.   REQUIRES: true
  15.   ENSURES: split L returns (A,B) such that A@B is a permutation of L & |length A - length B | <= 1
  16. *)
  17. fun split([] : int list) : int list * int list = ([], [])
  18.   | split([x]) = ([x], [])
  19.   | split(x::y::xs) =
  20.     let
  21.       val (A : int list, B : int list) = split xs
  22.     in
  23.       (x::A, y::B)
  24.     end
  25.  
  26. (* msort : int list -> int list
  27.   REQUIRES: true
  28.   ENSURES: msort L returns a sorted permutation of L
  29. *)
  30. fun msort([]: int list) : int list = []
  31.   | msort([x]) = [x]
  32.   | msort L =
  33.     let
  34.       val (A,B) : int list * int list = split L
  35.     in
  36.       merge(msort A, msort B)
  37.     end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement