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 の sort 関数も読みましたが、混乱します。
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 行目です。2 つの入力パラメーターを交換するだけです。このコードが実行される理由を教えてください。