バブルソート

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)))
)