クイックソート
バブルソート(id:thata:20050302#1109724669)の次はクイックソート。
途中、remove-if (非破壊的メソッド)とdelete-if (破壊的メソッド)を間違えて30分くらい悩む。同じ罠にかかったことがある人はオレだけじゃないはず、と思いたい。
;;(qsort '(2 1 3)) ;; => (1 2 3) (defun qsort (lst) (if (null lst) nil (let *1 lst)) (defun select-greater-equal (n lst) (remove-if-not (lambda (x) (>= x n)) lst))
*1:pivot (car lst) ) ) (append (qsort (select-less pivot (cdr lst))) (cons pivot (qsort (select-greater-equal pivot (cdr lst)))))))) (defun select-less (n lst) (remove-if-not (lambda (x) (< x n