Last active
October 2, 2015 20:53
-
-
Save ryanbaldwin/9e75032d6d53a3fc0087 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(ns ward.applied-mergesort | |
(:refer-clojure :exclude [merge])) | |
(defn merge | |
"Merges two sorted lists into a single sorted list." | |
[right left] | |
(flatten (loop [r right, l left, results []] | |
(let [rhead (first r) | |
lhead (first l)] | |
(cond (nil? rhead) (conj results l) | |
(nil? lhead) (conj results r) | |
(<= lhead rhead) (recur (rest l) r (conj results lhead)) | |
:else (recur l (rest r) (conj results rhead))))))) | |
(defn mergesort | |
"Performs a mergesort on any number of unordered lists, producing a single ordered list." | |
([items] | |
(if (<= (count items) 1) | |
items | |
(let [midpoint (/ (count items) 2) | |
left (mergesort (take midpoint items)) | |
right (mergesort (drop midpoint items))] | |
(merge left right)))) | |
([items & more] | |
(let [merged-items (map mergesort (conj more items))] | |
(reduce merge merged-items)))) | |
(defn random | |
"Creates a list n-long of random integers of a value up to max" | |
[n max] | |
(take n (repeatedly #(rand-int max)))) | |
(defn random-randomness [n] | |
"Creates an n-long list of random lists. Random meta." | |
(take n (repeatedly #(random (rand-int 100) 10000)))) | |
(let [lists (random-randomness 200)] | |
(prn "mergesorting " (count lists) "unordered lists") | |
(let [results (time (apply mergesort lists))] | |
(prn results) | |
(prn (str "sorted " (count results) " total results")))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment