I can honestly say that that isn't the algorithm that would have occured to me. In CL, this is the what I would have thought to do:
(defun butnth (index list)
(append (subseq list 0 index)
(subseq list (1+ index))))
(defun shuffle (list)
(unless (null list)
(let ((index (random (list-length list))))
(cons (nth index list)
(shuffle (butnth index list))))))
Building a second sequence by randomly selecting nodes from the old sequnece and inserting them into the new sequence seems more intuitive to me. It certainly works better with lists. If I where working with arays, the OPs method would be more efficient.