File: msort.sml

package info (click to toggle)
mlton 20100608-2
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 34,980 kB
  • ctags: 69,089
  • sloc: ansic: 18,421; lisp: 2,879; makefile: 1,570; sh: 1,325; pascal: 256; asm: 97
file content (21 lines) | stat: -rw-r--r-- 680 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
       fun cp [] =[]
         | cp (x::xs)= x :: cp xs

       (* exormorphic merge *)
       fun merge(xs, []):int list = cp xs
         | merge([], ys) = cp ys
         | merge(l1 as x::xs, l2 as y::ys) = 
               if x<y then x :: merge(xs, l2) 
               else y :: merge(l1, ys)

       (* splitting a list *)
       fun split(x::y::zs, l, r) = split(zs, x::l, y::r)
         | split([x], l, r) = (x::l, r)
         | split([], l, r) = (l, r)

       (* exomorphic merge sort *)
       fun msort []  = []
         | msort [x] = [x]
         | msort xs = let val (l, r) = split(xs, [], [])
                      in merge(msort l, msort r)
                      end;