Anonymous user
Sorting algorithms/Selection sort: Difference between revisions
update for CL, works with lists and vectors
(selection sort in Common Lisp for arrays) |
(update for CL, works with lists and vectors) |
||
Line 193:
=={{header|Common Lisp}}==
<lang lisp>(defun selection-sort-vector (array predicate)
(do ((length (length array))
(i 0 (1+ i)))
Line 205 ⟶ 204:
(when (funcall predicate (aref array j) min)
(setf min (aref array j)
mindex j)))))
(defun selection-sort-list (list predicate)
Example use:▼
(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)))))))
<pre>> (defparameter *vec* (vector 1 0 2 9 3 8 4 7 5 6))▼
(etypecase sequence
(list (selection-sort-list sequence predicate))
(vector (selection-sort-vector sequence predicate))))</lang>
▲Example use:
<pre>> (let ((l (list 8 7 4 3 2 0 9 1 5 6)))
▲> (selection-sort *vec* '<)
▲> (selection-sort *vec* '>)
(selection-sort l '>))
#(9 8 7 6 5 4 3 2 1 0)</pre>
|