我在 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 行。它只是交换两个输入参数!你能解释一下为什么这段代码会运行吗?