blob: d9a70e9c56088912efaa5f5246aa8491c5c78c34 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
signature SORT =
sig
val sort : ('a * 'a -> order) -> 'a list -> 'a list
end
structure Sort :> SORT =
struct
fun merge (_ : 'a * 'a -> order) ([] : 'a list) (l2 : 'a list) : 'a list = l2
| merge _ l1 [] = l1
| merge cmp (xl as x :: xs) (yl as y :: ys) =
(case cmp (x, y) of
GREATER => y :: merge cmp xl ys
| _ => x :: merge cmp xs yl)
fun sort (_ : 'a * 'a -> order) ([] : 'a list) : 'a list = []
| sort _ [x] = [x]
| sort cmp l =
let
val n = length l
val half1 = List.take (l, n div 2)
val half2 = List.drop (l, n div 2)
in merge cmp (sort cmp half1) (sort cmp half2)
end
end
|