Sorting algorithms/Selection sort: Difference between revisions
Content added Content deleted
(selection sort in Common Lisp for arrays) |
(update for CL, works with lists and vectors) |
||
Line 193: | Line 193: | ||
=={{header|Common Lisp}}== |
=={{header|Common Lisp}}== |
||
<lang lisp>(defun selection-sort (array predicate) |
<lang lisp>(defun selection-sort-vector (array predicate) |
||
"Sort array according to predicate." |
|||
(do ((length (length array)) |
(do ((length (length array)) |
||
(i 0 (1+ i))) |
(i 0 (1+ i))) |
||
Line 205: | Line 204: | ||
(when (funcall predicate (aref array j) min) |
(when (funcall predicate (aref array j) min) |
||
(setf min (aref array j) |
(setf min (aref array j) |
||
mindex j))))) |
mindex j))))) |
||
(defun selection-sort-list (list predicate) |
|||
⚫ | |||
(flet ((min-first (list) |
|||
(do ((before-min nil) |
|||
(min (first list)) |
|||
(prev list (rest prev)) |
|||
(curr (rest list) (rest curr))) |
|||
((endp curr) |
|||
(if (null before-min) list |
|||
(let ((min (cdr before-min))) |
|||
(rplacd before-min (cdr min)) |
|||
(rplacd min list) |
|||
min))) |
|||
(when (funcall predicate (first curr) min) |
|||
(setf before-min prev |
|||
min (first curr)))))) |
|||
(let ((result (min-first list))) |
|||
(do ((head result (rest head))) |
|||
((endp (rest head)) result) |
|||
(rplacd head (min-first (rest head))))))) |
|||
⚫ | |||
⚫ | |||
(etypecase sequence |
|||
*VEC* |
|||
(list (selection-sort-list sequence predicate)) |
|||
(vector (selection-sort-vector sequence predicate))))</lang> |
|||
⚫ | |||
<pre>> (let ((l (list 8 7 4 3 2 0 9 1 5 6))) |
|||
⚫ | |||
⚫ | |||
(0 1 2 3 4 5 6 7 8 9) |
|||
⚫ | |||
⚫ | |||
(selection-sort l '>)) |
|||
#(9 8 7 6 5 4 3 2 1 0)</pre> |
#(9 8 7 6 5 4 3 2 1 0)</pre> |
||