나는 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 (방법 심볼 인수 *))와 (. 인스턴스 expr에있어서 심볼 인수 *)가 동등 . 나는 왜 똑같은 많은 다른 형태가 있는지 궁금하다. – qiuxiafei
유산 가방의 결과 일 수도있다. :) – Ankur