mirror of
https://github.com/justinethier/cyclone.git
synced 2025-05-18 21:29:18 +02:00
30 lines
977 B
Scheme
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))))))
|
|
|