如何在Clojure中实现整数的计数排序?

时间:2018-02-28 22:37:01

标签: sorting clojure counting-sort

假设我有一个整数数组xs0max取值,我需要在O(n)时间内对它进行排序,所以我不能只需(sort xs)

有没有办法用frequencies函数来完成?

在另一种语言中,我会执行for迭代从0max的整数,对于该范围内的每个值x,请查找{{ 1}}然后执行(frequencies x)或其他内容。

至关重要的是,我需要在从最小到最高的顺序中执行此操作,这就是整个事情的一种选择。因此,我想repeat (frequencies x) x只想map中的每个号码。

关于clojure-ish惯用解决方案的任何想法?

感谢。

2 个答案:

答案 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))))