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


(defun selection-sort (sequence predicate)
<pre>> (defparameter *vec* (vector 1 0 2 9 3 8 4 7 5 6))
(etypecase sequence
*VEC*
(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 l '<))
#(0 1 2 3 4 5 6 7 8 9)
(0 1 2 3 4 5 6 7 8 9)


> (let ((l (vector 8 7 4 3 2 0 9 1 5 6)))
> (selection-sort *vec* '>)
(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>