マージソート習作
(defun divide-two (&optional (list) (f-list nil)) (if (< (length f-list) (length list)) (divide-two (cdr list) (append f-list (list (car list)))) (cons f-list list))) (defun do-simple-insert (list num) (if (not list) (setf list (list num)) (if (< (car list) num) (setf (cdr list) (do-simple-insert (cdr list) num)) (setf list (cons num list)))) list) (defun simple-insert-sort (list) (let ((ret-list)) (dolist (x list ret-list) (setf ret-list (do-simple-insert ret-list x))))) (defun merge-sort (list) (if (< 2 (length list)) (let ((lst (divide-two list))) (setf list (append (merge-sort (car lst)) (merge-sort (cdr lst)))))) (simple-insert-sort list)) ; 結果 ; * (merge-sort '(11 8 10 13 4 15 1 12 2)) ; ; (1 2 4 8 10 11 12 13 15) ; *
結合の際のソートに単純挿入ソートを採用したのだが、どうなんだろう。自分の見た範囲では、このへんについての説明が結構曖昧で、どこら辺が正しいアルゴリズムなのかが掴みづらかった。