summaryrefslogtreecommitdiffstats
path: root/stdlib/sort.ml
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/sort.ml')
-rw-r--r--stdlib/sort.ml28
1 files changed, 28 insertions, 0 deletions
diff --git a/stdlib/sort.ml b/stdlib/sort.ml
new file mode 100644
index 000000000..1b694bfff
--- /dev/null
+++ b/stdlib/sort.ml
@@ -0,0 +1,28 @@
+(* Merging and sorting *)
+
+let rec merge order l1 l2 =
+ match l1 with
+ [] -> l2
+ | h1 :: t1 ->
+ match l2 with
+ [] -> l1
+ | h2 :: t2 ->
+ if order h1 h2
+ then h1 :: merge order t1 l2
+ else h2 :: merge order l1 t2
+
+let list order l =
+ let rec initlist = function
+ [] -> []
+ | [e] -> [[e]]
+ | e1::e2::rest ->
+ (if order e1 e2 then [e1;e2] else [e2;e1]) :: initlist rest in
+ let rec merge2 = function
+ l1::l2::rest -> merge order l1 l2 :: merge2 rest
+ | x -> x in
+ let rec mergeall = function
+ [] -> []
+ | [l] -> l
+ | llist -> mergeall (merge2 llist) in
+ mergeall(initlist l)
+