仮想計算機構

IT業界と無縁な派遣社員のブログ

選択ソート

奥村本を参考に選択ソートの実装。arrayではなくlistを使う。
再帰などは使わずにC言語っぽい感じで。コードは以下の通り。

(define (selectsort a)
    (define min_a 0)
    (define k 0)
    (define n (length a))
    (do ((i 0 (+ i 1))) ((>= i (- n 1)))
        ;;; body
        (set! min_a (list-ref a i))
        (set! k i) 
        (do
            ;;; update
            ((j (+ i 1) (+ j 1)))
            ;;; condition
            ((>= j n))
            ;;; body
            (if (< (list-ref a j) min_a) 
                (begin 
                    (set! min_a (list-ref a j))
                    (set! k j)
                )
            )
        )
        (list-set! a k (list-ref a i))
        (list-set! a i min_a)
    )
    a
)

(define (main args)
    (print (selectsort (map (lambda (x) (string->number x)) (cdr args))))
)

実行結果は以下の通り。
(CPU : Intel Core i5 2.6GHz, OS : Windows 10, Gauche 0.9.9)

> gosh .\main.scm 5 2 9 1 0 3 7 6
(0 1 2 3 5 6 7 9)

リストについてはこちらを参考にした。