奇遇置換ソート

Wikipediaに参考コードがありますが。
http://ja.wikipedia.org/wiki/%E5%A5%87%E5%81%B6%E8%BB%A2%E7%BD%AE%E3%82%BD%E3%83%BC%E3%83%88

(defn- oe-swap [v]
  (loop [src v
         dest []
         swapped? false]
    (if (< (count src) 2) [(concat dest src) swapped?]
        (if (> (first src) (second src))
          (recur (rest (rest src))
                 (conj dest (second src) (first src))
                 true)
          (recur (rest (rest src))
                 (conj dest (first src) (second src))
                 swapped?)))))

(defn odd-even-transposition-sort [v]
  (let [[odd-sorted o-swapped?] (oe-swap v)
        [even-sorted e-swapped?] (oe-swap (rest odd-sorted))
        even-sorted (cons (first odd-sorted) even-sorted)]
    (if (or o-swapped? e-swapped?) (recur even-sorted)
        even-sorted)))