diff options
| author | Rose Hogenson <rosehogenson@posteo.net> | 2025-05-16 16:54:17 -0700 |
|---|---|---|
| committer | Rose Hogenson <rosehogenson@posteo.net> | 2025-05-16 16:54:17 -0700 |
| commit | 5582235bd300f8de997192f9109d596d12df4bbe (patch) | |
| tree | d219a6c0a3d96052eec422527cd05775354abf76 /Sort.sml | |
| parent | Fix spelling in GenSym (diff) | |
| download | sml-5582235bd300f8de997192f9109d596d12df4bbe.tar.zst | |
Fix spelling of file names
Diffstat (limited to 'Sort.sml')
| -rw-r--r-- | Sort.sml | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/Sort.sml b/Sort.sml new file mode 100644 index 0000000..d9a70e9 --- /dev/null +++ b/Sort.sml @@ -0,0 +1,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 |
