Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (ns hello.core
- (:refer-clojure :exclude [reduce map partition partition-by take into merge])
- (:require [clojure.core.async :refer :all])
- (:gen-class))
- (defn qsort [xs]
- (let [p (first xs)
- xs (rest xs)]
- (if p
- (concat (qsort (filter #(< % p) xs))
- [p]
- (qsort (filter #(<= p %) xs)))
- [])))
- #_(prn (qsort [3 1 4 1 5 9]))
- (defn- qsort2* [xs]
- (let [c (chan 1)]
- (go (let [p (first xs)
- xs (rest xs)]
- (>! c (if p
- (let [left (qsort2* (filter #(< % p) xs))
- right (qsort2* (filter #(<= p %) xs))]
- (concat (<! left) [p] (<! right)))
- []))
- (close! c)))
- c))
- (defn qsort2 [xs]
- (<!! (go (<! (qsort2* xs)))))
- (defn- qsort3* [xs]
- (future
- (let [p (first xs)
- xs (rest xs)]
- (if p
- (let [left (qsort3* (filter #(< % p) xs))
- right (qsort3* (filter #(<= p %) xs))]
- (concat @left [p] @right))
- []))))
- (defn qsort3 [xs]
- @(qsort3* xs))
- (defn -main [& args]
- (let [big-list (mapv (fn [_] (rand-int 100)) (range 10000)) ]
- (let [bench-before (System/currentTimeMillis)]
- (qsort big-list)
- (prn 'qsort 'Took (- (System/currentTimeMillis) bench-before) 'msec))
- (let [bench-before (System/currentTimeMillis)]
- (qsort2 big-list)
- (prn 'qsort2 'Took (- (System/currentTimeMillis) bench-before) 'msec))
- (let [bench-before (System/currentTimeMillis)]
- (qsort3 big-list)
- (prn 'qsort3 'Took (- (System/currentTimeMillis) bench-before) 'msec))))
- ; vim: lispwords+=go-loop :
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement