summaryrefslogtreecommitdiffstats
path: root/sort.sml
diff options
context:
space:
mode:
authorRose Hogenson <rosehogenson@posteo.net>2024-04-28 15:06:43 -0700
committerRose Hogenson <rosehogenson@posteo.net>2024-04-28 15:06:43 -0700
commit5737e8430d43b3b5bd448f761cd2f3c35707a174 (patch)
treeb24f44ea5245a56b2f712c2eef6a3897f53bd098 /sort.sml
parent9f5889c1263d63b953b3a324da07321deef5ca58 (diff)
downloadsml-5737e8430d43b3b5bd448f761cd2f3c35707a174.tar.zst
Add case over int.
Diffstat (limited to 'sort.sml')
-rw-r--r--sort.sml30
1 files changed, 30 insertions, 0 deletions
diff --git a/sort.sml b/sort.sml
new file mode 100644
index 0000000..97e4a8b
--- /dev/null
+++ b/sort.sml
@@ -0,0 +1,30 @@
+signature SORT =
+sig
+ val sort : ('a * 'a -> order) -> 'a list -> 'a list
+end
+
+structure Sort :> SORT =
+struct
+ fun split (l : 'a list, n : int) : ('a list * int) * ('a list * int) =
+ let val h = n div 2
+ in ((l, h), (List.drop (l, h), n - h))
+ end
+
+ 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' (cmp : 'a * 'a -> order) (s as (l : 'a list, n : int)) : 'a list =
+ if n < 2 then List.take (l, n) else
+ let
+ val (first, second) = split s
+ val firstSorted = sort' cmp first
+ val secondSorted = sort' cmp second
+ in merge cmp firstSorted secondSorted
+ end
+
+ fun sort (cmp : 'a * 'a -> order) (l : 'a list) : 'a list = sort' cmp (l, length l)
+end