; finding the median

(define (median xs)
  (let* ((counts (make-vector 256 0))
         (len (do ((xs xs (cdr xs)) (len 0 (+ len 1))) ((null? xs) len)
                (vector-set! counts (car xs) (+ (vector-ref counts (car xs)) 1)))))
    (let loop ((lo 0) (lo-count 0) (hi 255) (hi-count 0))
      (cond ((< lo-count (/ len 2)) (loop (+ lo 1) (+ lo-count (vector-ref counts lo)) hi hi-count))
            ((< hi-count (/ len 2)) (loop lo lo-count (- hi 1) (+ hi-count (vector-ref counts hi))))
            (else (/ (+ lo hi) 2))))))

(display (median '(2 4 5 7 3 6 1))) (newline)
(display (median '(5 2 1 6 3 4))) (newline)