L'idée de cette implémentation est de considérer les éléments au début du vecteur comme triés, et les autres comme une source non triée d'éléments à insérer.
insertionvecteur.lisp
On remarque l'utilisation d'une clause with pour chacune des boucles, éliminant la nécessité de l'entourer d'un let. On remarque aussi la double condition de terminaison de la boucle intérieure, à la fois sur la comparaison des éléments et le fait d'arriver au début du tableau. Finalement, on remarque l'utilisation de la clause finally dans la boucle intérieure.
Comme le montre son utilisation, cette implémentation est stable :
* (defparameter *v* #(4 1 3 1 8 3 44 5 7 3 9 0 0 3 2 44 5 33))
*V*
* (insertionsort1 *v*)
NIL
* *v*
#(0 0 1 1 2 3 3 3 3 4 5 5 7 8 9 33 44 44)
* (insertionsort1 *v* :test #'(lambda (x y) (and (oddp x) (evenp y))))
NIL
* *v*
#(1 1 3 3 3 3 5 5 7 9 33 0 0 2 4 8 44 44)
* (insertionsort1 *v* :test #'>)
NIL
* *v*
#(44 44 33 9 8 7 5 5 4 3 3 3 3 2 1 1 0 0)
* (insertionsort1 *v* :test #'(lambda (x y) (and (oddp x) (evenp y))))
NIL
* *v*
#(33 9 7 5 5 3 3 3 3 1 1 44 44 8 4 2 0 0)
*