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)
"Sort array according to 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)))))</lang>
 
(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 *vec*(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 *vec*l '><))
#(0 1 2 3 4 5 6 7 8 9)
 
<pre>> (defparameterlet *vec*((l (vector 18 07 2 94 3 82 40 79 1 5 6)))
> (selection-sort *vec* '>)
(selection-sort l '>))
#(9 8 7 6 5 4 3 2 1 0)</pre>
 
Anonymous user