基数ソート習作

(defun set-array (&optional (list) (num) (array (make-array '(10) :initial-element nil)))
  (if (not list)
      array
      (let ((key (truncate (mod (/ (car list) (expt 10 num)) 10))))
	(setf (svref array key) (append (svref array key) (list (car list))))
	(set-array (cdr list) num array))))

(defun array-to-list (&optional (array) (num 0))
  (if (< num (length array))
      (append (svref array num) (array-to-list array (1+ num)))))

(defun max-elements (&optional (list) (elm 0))
  (if (not list)
      elm
      (max-elements (cdr list) (if (> elm (car list)) elm (car list)))))

(defun check-diginum (&optional (num) (digi 0))
  (if (< 0 (truncate (mod (/ num (expt 10 digi)) 10)))
      (check-diginum num (1+ digi))
      (1+ digi)))

(defun radix-sort (list)
  (dotimes (x (check-diginum (max-elements list)) list)
    (setf bucket (set-array list x)
	  list (array-to-list bucket))))

; 結果
; * (radix-sort '(11 8 10 13 4 15 1 12 2))
;
; (1 2 4 8 10 11 12 13 15)
; *