(define (counting-sort! fortuita sortita max) (let ((numerata (make-vector max 0))) (loop count ((for x i (in-vector fortuita))) (vector-set! numerata x (+ (vector-ref numerata x) 1)) (count)) (loop leq ((for x i (in-vector numerata 1))) (vector-set! numerata i (+ x (vector-ref numerata (- i 1)))) (leq)) (loop sort ((for x i (in-vector-reverse fortuita))) (let ((count-index (- (vector-ref numerata x) 1))) (vector-set! sortita count-index x) (vector-set! numerata x count-index)) (sort)))) (let* ((fortuita (vector 6 0 2 0 1 3 4 6 1 3 2)) (sortita (make-vector (vector-length fortuita)))) (let ((max (+ (apply max (vector->list fortuita)) 1))) (counting-sort! fortuita sortita max) sortita)) ;;; #(0 0 1 1 2 2 3 3 4 6 6)