リストをソートする


Tags: R6RS, リスト

リストをソートするには list-sort 手続きを使う。

(import (rnrs base)
        (rnrs sorting))

(list-sort < '(-1 4 2 6 -7 9 -10 1 2))
;; => (-10 -7 -1 1 2 2 4 6 9)

リストの要素自体とは異なる基準でソートしたい場合には wikipedia-en:Schwartzian_transform を使う。

(import (rnrs base)
        (rnrs sorting))

(define (list-sort-by cmp-proc key-proc xs)
  (map car
       (list-sort (lambda (a b)
                    (cmp-proc (cdr a) (cdr b)))
                  (map (lambda (x)
                         (cons x (key-proc x)))
                       xs))))

(list-sort-by < abs '(-1 4 2 6 -7 9 -10 1 2))
;; => (-1 1 2 2 4 6 -7 9 -10)

list-sort は安定な並べ替えを行なうことが保証されている。