summaryrefslogtreecommitdiff
path: root/appl/lib/sort.b
diff options
context:
space:
mode:
Diffstat (limited to 'appl/lib/sort.b')
-rw-r--r--appl/lib/sort.b36
1 files changed, 36 insertions, 0 deletions
diff --git a/appl/lib/sort.b b/appl/lib/sort.b
new file mode 100644
index 00000000..a425845e
--- /dev/null
+++ b/appl/lib/sort.b
@@ -0,0 +1,36 @@
+implement Sort;
+include "sort.m";
+
+sort[S, T](s: S, a: array of T)
+ for{
+ S =>
+ gt: fn(s: self S, x, y: T): int;
+ }
+{
+ mergesort(s, a, array[len a] of T);
+}
+
+mergesort[S, T](s: S, a, b: array of T)
+ for{
+ S =>
+ gt: fn(s: self S, x, y: T): int;
+ }
+{
+ r := len a;
+ if (r > 1) {
+ m := (r-1)/2 + 1;
+ mergesort(s, a[0:m], b[0:m]);
+ mergesort(s, a[m:], b[m:]);
+ b[0:] = a;
+ for ((i, j, k) := (0, m, 0); i < m && j < r; k++) {
+ if(s.gt(b[i], b[j]))
+ a[k] = b[j++];
+ else
+ a[k] = b[i++];
+ }
+ if (i < m)
+ a[k:] = b[i:m];
+ else if (j < r)
+ a[k:] = b[j:r];
+ }
+}