Lispでバブルソートを書いてみた。よ。
;; バブルソート
(defun bsort (lst)
(cond
((null lst) nil)
((= 1 (length lst) ) lst)
(t (let ((l (bubbleup lst)))
(cons (car l) (bsort (cdr l)))))))
;; リストの中で一番小さいのを一番上に持ってくる
(defun bubbleup (lst)
(cond
((null lst) nil)
((= 1 (length lst) ) lst)
(t (let* ( (x (car lst) )
(l (bubbleup (cdr lst)))
(y (car l)))
(if (>= x y)
(cons y (cons x (cdr l)))
(cons x (cons y (cdr l))))))))
;; test
(progn
(assert-equal '() (bsort '()))
(assert-equal '(1) (bsort '(1)))
(assert-equal '(1 2) (bsort '(2 1)))
(assert-equal '(1 2 3) (bsort '(3 2 1)))
(assert-equal '(1 2 3) (bsort '(2 1 3)))
)
(progn
(assert-equal '() (bubbleup '()))
(assert-equal '(1) (bubbleup '(1)))
(assert-equal '(1 2) (bubbleup '(2 1)))
(assert-equal '(1 2) (bubbleup '(1 2)))
(assert-equal '(1 3 2) (bubbleup '(3 2 1)))
(assert-equal '(1 2 3) (bubbleup '(2 1 3)))
)