Skip to content

Instantly share code, notes, and snippets.

@ahjones
Created June 13, 2012 21:16
Show Gist options
  • Save ahjones/2926552 to your computer and use it in GitHub Desktop.
Save ahjones/2926552 to your computer and use it in GitHub Desktop.
Quicksort with clojure
(ns sort)
(defn qsort [l]
(if (first l)
(concat
(qsort (filter #(< (first l) %) (rest l)))
[(first l)]
(qsort (filter #(>= (first l) %) (rest l))))
()))
(defn qsort2 [[x & xs]]
(if x
(concat
(qsort2 (filter #(< x %) xs))
[x]
(qsort2 (filter #(>= x %) xs)))
()))
(defn qsort3 [[x & xs]]
(if x
(letfn [(greater [y] (< x y))]
(concat
(qsort3 (filter greater xs))
[x]
(qsort3 (filter (complement greater) xs))))
()))
(defn qsort4 [[x & xs]]
(if x
(letfn [(greater [y] (< x y))]
(lazy-cat
(qsort4 (filter greater xs))
[x]
(qsort4 (filter (complement greater) xs))))
()))
(defn random [n]
(take n (repeatedly #(rand-int 1000))))
(defn -main []
(let [n 100000
[r1 r2] [(random n) (random n)]]
(time (take 50 (qsort r1))) ; 4623 msec
(time (take 50 (qsort4 r2)))) ; 0.47 msec
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment