(use srfi-4) (define (axial-vectors-ref axv i) (map (lambda (x) (f64vector-ref x i)) axv)) (define (axial-vectors-set! axv i vs) (for-each (lambda (x v) (f64vector-set! x i v)) axv vs)) (define (axial-vectors-slice axv m n) (map (lambda (x) (f64vector-slice x m n)) axv)) (define (axial-vectors-length axv) (car (map f64vector-length axv))) (define (axial-vectors-swap! axv i j) (let ((t (axial-vectors-ref axv i))) (axial-vectors-set! axv i (axial-vectors-ref axv j)) (axial-vectors-set! axv j t))) (define (axial-vectors-quick-sort! v elt< . rest) (let-optionals rest ((start 0) (end (axial-vectors-length v))) (let recur ((l start) (r end)) ; Sort the range [l,r). (if (fx< 1 (fx- r l)) ;; Choose the median of V[l], V[r], and V[middle] for the pivot. (let ((median (lambda (i1 i2 i3) (let ((v1 (axial-vectors-ref v i1)) (v2 (axial-vectors-ref v i2)) (v3 (axial-vectors-ref v i3))) (receive (ilittle little ibig big) (if (elt< v1 v2) (values i1 v1 i2 v2) (values i2 v2 i1 v1)) (if (elt< big v3) (values ibig big) (if (elt< little v3) (values i3 v3) (values ilittle little)))))))) (let-values (((ipivot pivot) (median l (quotient (fx+ l r) 2) (fx- r 1)))) (let loop ((i l) (j (fx- r 1))) (let ((i (let scan ((i i)) (if (elt< (axial-vectors-ref v i) pivot) (scan (fx+ i 1)) i))) (j (let scan ((j j)) (if (elt< pivot (axial-vectors-ref v j)) (scan (fx- j 1)) j)))) (if (fx< i j) (begin (axial-vectors-swap! v i j (axial-vectors-ref v i)) (loop (fx+ i 1) (fx- j 1))) (begin (recur l i) (recur (fx+ j 1) r))))))) v)) )) #| (define v (list (f64vector -0.222040417143891 -0.130686806836244 -1.1393810545548 -1.00134012588717 0.0924614903801722 0.42675256780991 0.551266501042691 0.625060401322083 0.883934414691624 1.21222958296103) (f64vector -2.17154877253389 -0.834435142767373 0.225814871833791 0.437485236568444 1.21484732174379 -1.68427156225624 -0.0535433787075397 0.969658849385054 0.414706397978174 0.279138871747951) (f64vector 0.520316303519054 0.0769195867181162 0.354078180046104 0.843539318556113 -1.03408418836396 -0.611541686998526 0.18774392065007 0.418251640058755 1.86917059941044 0.0956638351872146))) (print "v = ") (pp v) (axial-vectors-quick-sort! v (lambda (x y) (< (list-ref x 1) (list-ref y 1))) 5 9) (print "sorted v = ") (pp v) |#