;;;; 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))))))