假设我有一个整数数组xs
从0
到max
取值,我需要在O(n)时间内对它进行排序,所以我不能只需(sort xs)
。
有没有办法用frequencies
函数来完成?
在另一种语言中,我会执行for
迭代从0
到max
的整数,对于该范围内的每个值x
,请查找{{ 1}}然后执行(frequencies x)
或其他内容。
至关重要的是,我需要在从最小到最高的顺序中执行此操作,这就是整个事情的一种选择。因此,我想repeat (frequencies x) x
只想map
中的每个号码。
关于clojure-ish惯用解决方案的任何想法?
感谢。
答案 0 :(得分:0)
更新矢量并非O(1),但您可以使用它来为每个元素创建计数:
(defn counting-sort [s]
(if (empty? s)
s
(let [counts (reduce (fn [v e]
(update v e inc))
(vec (repeat (inc (apply max s)) 0))
s)]
(apply concat (map-indexed #(repeat %2 %1) counts)))))
答案 1 :(得分:0)
你可以用clojure做你说的话:
(let [xs [1 2 1 4 1 5 1 8 7 7 7]
fs (frequencies xs)
max 10]
(into []
cat
(for [i (range max) :when (contains? fs i)]
(repeat (get fs i) i))))