我在clojure写了一个快速排序函数,但它运行速度非常慢。有时,如果输入集合变大,甚至可能溢出堆栈?在clojure缓慢'快速排序'
我的代码有问题吗?
(defn qsort [coll]
(if (<= (count coll) 1)
coll
(let [pivot (last coll)
head-half (filter #(< % pivot) (drop-last coll))
tail-half (filter #(>= % pivot) (drop-last coll))]
(concat (qsort head-half) (vector pivot) (qsort tail-half)))))
我也读过clojure.core中的排序函数,但它使混淆。
01 (defn sort
02 "Returns a sorted sequence of the items in coll. If no comparator is
03 supplied, uses compare. comparator must
04 implement java.util.Comparator."
05 {:added "1.0"
06 :static true}
07 ([coll]
08 (sort compare coll))
09 ([^java.util.Comparator comp coll]
10 (if (seq coll)
11 (let [a (to-array coll)]
12 (. java.util.Arrays (sort a comp))
13 (seq a))
14 ())))
发生递归的唯一地方是在第12行。它只是交换两个输入参数! 您能否向我解释为什么这段代码是运行的?
//clojure.org/java_interop#dot (实例EXPR(方法符号ARGS *))和 (实例EXPR方法符号ARGS *)是等效的。 我想知道为什么有这么多不同的形式为同一件事 – qiuxiafei
可能是遗留行李的结果:) – Ankur