cyclone/srfi/sorting/median.scm
2016-08-23 23:51:19 -04:00

30 lines
977 B
Scheme

;;;; Finding the median of a vector
;; This involves sorting the vector, which is why it's part
;; of this package.
(define (vector-find-median < v knil . maybe-mean)
(define mean (if (null? maybe-mean)
(lambda (a b) (/ (+ a b) 2))
(car maybe-mean)))
(define len (vector-length v))
(define newv (vector-sort < v))
(cond
((= len 0) knil)
((odd? len) (vector-ref newv (/ (- len 1) 2)))
(else (mean
(vector-ref newv (- (/ len 2) 1))
(vector-ref newv (/ len 2))))))
(define (vector-find-median! < v knil . maybe-mean)
(define mean (if (null? maybe-mean)
(lambda (a b) (/ (+ a b) 2))
(car maybe-mean)))
(define len (vector-length v))
(define newv (vector-sort! < v))
(cond
((= len 0) knil)
((odd? len) (vector-ref newv (/ (- len 1) 2)))
(else (mean
(vector-ref newv (- (/ len 2) 1))
(vector-ref newv (/ len 2))))))