aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRose Hogenson <rhogenson@posteo.net>2022-01-22 17:51:32 -0800
committerRose Hogenson <rhogenson@posteo.net>2022-01-22 17:51:32 -0800
commitd1c59f340c623eb533f1b59564b0e3cd8f5ca728 (patch)
tree64fe24fa911970d690e9eab9d6fd542746d331cd
parentAdd a loop macro. (diff)
downloadchromatopelma-d1c59f340c623eb533f1b59564b0e3cd8f5ca728.tar.zst
Store the list length in sort.
Computing length each time is very unnecessary.
-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)))))