Advertisement
Guest User

Untitled

a guest
May 27th, 2015
260
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.59 KB | None | 0 0
  1. (ns hello.core
  2. (:refer-clojure :exclude [reduce map partition partition-by take into merge])
  3. (:require [clojure.core.async :refer :all])
  4. (:gen-class))
  5.  
  6. (defn qsort [xs]
  7. (let [p (first xs)
  8. xs (rest xs)]
  9. (if p
  10. (concat (qsort (filter #(< % p) xs))
  11. [p]
  12. (qsort (filter #(<= p %) xs)))
  13. [])))
  14. #_(prn (qsort [3 1 4 1 5 9]))
  15.  
  16. (defn- qsort2* [xs]
  17. (let [c (chan 1)]
  18. (go (let [p (first xs)
  19. xs (rest xs)]
  20. (>! c (if p
  21. (let [left (qsort2* (filter #(< % p) xs))
  22. right (qsort2* (filter #(<= p %) xs))]
  23. (concat (<! left) [p] (<! right)))
  24. []))
  25. (close! c)))
  26. c))
  27.  
  28. (defn qsort2 [xs]
  29. (<!! (go (<! (qsort2* xs)))))
  30.  
  31. (defn- qsort3* [xs]
  32. (future
  33. (let [p (first xs)
  34. xs (rest xs)]
  35. (if p
  36. (let [left (qsort3* (filter #(< % p) xs))
  37. right (qsort3* (filter #(<= p %) xs))]
  38. (concat @left [p] @right))
  39. []))))
  40.  
  41. (defn qsort3 [xs]
  42. @(qsort3* xs))
  43.  
  44. (defn -main [& args]
  45. (let [big-list (mapv (fn [_] (rand-int 100)) (range 10000)) ]
  46. (let [bench-before (System/currentTimeMillis)]
  47. (qsort big-list)
  48. (prn 'qsort 'Took (- (System/currentTimeMillis) bench-before) 'msec))
  49. (let [bench-before (System/currentTimeMillis)]
  50. (qsort2 big-list)
  51. (prn 'qsort2 'Took (- (System/currentTimeMillis) bench-before) 'msec))
  52. (let [bench-before (System/currentTimeMillis)]
  53. (qsort3 big-list)
  54. (prn 'qsort3 'Took (- (System/currentTimeMillis) bench-before) 'msec))))
  55. ; vim: lispwords+=go-loop :
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement