Hello,

I tried writing a naive implementation of quicksort using an
accumulator. Right now, the code is stack-consuming and returns a
stackoverflowerror on large lists. Is there any way to prevent it from
consuming stack with some changes? The code is as follows -

(declare qsort qsort* partify)

(defn partify
  [item coll [less equal greater] acc]
  (if (empty? coll)
    (qsort* less (concat equal (qsort* greater acc)))
    (let [[head & tail] coll]
      (cond
       (< head item) (recur item tail [(cons head less) equal greater] acc)
       (> head item) (recur item tail [less equal (cons head greater)] acc)
       :else (recur item tail [less (cons head equal) greater] acc)))))

(defn qsort*
  [coll acc]
  (if-let [coll (seq coll)]
    (partify (first coll) (rest coll) [[] [(first coll)] []] acc)
    acc))

(defn qsort
  "Perform Quicksort, with apologies to C.A.R. Hoare"
  [coll]
  (if-let [coll (seq coll)]
    (qsort* coll [])
    []))

Regards,
BG

-- 
Baishampayan Ghose
b.ghose at gmail.com

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to