aboutsummaryrefslogtreecommitdiffstats
path: root/csc
diff options
context:
space:
mode:
Diffstat (limited to 'csc')
-rw-r--r--csc/sort.csc20
1 files changed, 12 insertions, 8 deletions
diff --git a/csc/sort.csc b/csc/sort.csc
index 62b1c9d..6be1e16 100644
--- a/csc/sort.csc
+++ b/csc/sort.csc
@@ -7,13 +7,13 @@
(begin
- (define (sort cmp xs)
- (let ((len (length xs)))
- (if (<= len 1)
- xs
- (let-values (((half-a half-b) (split-at (truncate-quotient len 2) xs)))
- (let ((sorted-half-a (sort cmp half-a))
- (sorted-half-b (sort cmp half-b)))
+ (define (sort-len cmp xs len)
+ (if (<= len 1)
+ xs
+ (let ((n/2 (truncate-quotient len 2)))
+ (let-values (((half-a half-b) (split-at n/2 xs)))
+ (let ((sorted-half-a (sort-len cmp half-a n/2))
+ (sorted-half-b (sort-len cmp half-b (- len n/2))))
(let loop ((a sorted-half-a)
(b sorted-half-b)
(acc '()))
@@ -21,4 +21,8 @@
((null? b) (revappend acc a))
((cmp (car b) (car a))
(loop a (cdr b) (cons (car b) acc)))
- (else (loop (cdr a) b (cons (car a) acc))))))))))))
+ (else (loop (cdr a) b (cons (car a) acc))))))))))
+
+
+ (define (sort cmp xs)
+ (sort-len cmp xs (length xs)))))