2010/12/29 Ken Wesson <kwess...@gmail.com> > On Wed, Dec 29, 2010 at 11:14 AM, Andreas Kostler > <andreas.koestler.le...@gmail.com> wrote: > > Hi all, > > I've implemented a recursive version of insertion sort as a bit of an > warm up with clojure. For some reason it just doesn't "feel" right. The > recursion feels forced on poor old insertion sort. This might be inherent to > insertion sort. > > My poor clojure skills are more likely to blame, though. > > Can I please get some feedback on how to address the problem in a more > idiomatic way? > > > > ; Inserts element into a sorted vector > > (defn insert-into [sorted-vec element] > > (loop [i (count sorted-vec)] > > (if (and (> i 0) (> (nth sorted-vec (dec i)) element)) > > (recur (dec i)) > > (into (conj (subvec sorted-vec 0 i) element) (subvec > sorted-vec i))))) > > > > > > (defn insertion-sort [vector] > > (loop [i 0 > > _vec vector] > > (if (< i (count _vec)) > > (recur (inc i) > > (into (insert-into (subvec _vec 0 i) (nth _vec i)) > (subvec _vec (inc i)))) > > _vec))) > > > > Kind Regards > > Andreas > > Vectors are actually rather poorly designed for that sort of thing > (insertion in the middle) and loop is generally to be resorted to only > if there isn't a higher-order function that will do the job. How > about: > > (defn insert-into [s x] > (let [[low high] (split-with #(< % x) s)] > (concat low [x] high))) > > (defn insertion-sort [s] > (reduce insert-into [] s)) >
Hello, just a little 0.00002€ : insert-into will return seqs, so the reduce could read : (reduce insert-into () s) to make it clear that it's seqs end to end inside insertion-sort > > Here, split-with and reduce are the HOFs that obviate the need for loop. > > -- > 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<clojure%2bunsubscr...@googlegroups.com> > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > -- 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