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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Clojure中实现整数的计数排序?相关的知识,希望对你有一定的参考价值。

假设我有一个整数xs数组从0max的值,我需要在O(n)时间排序,所以我不能只做(sort xs)

有没有办法用frequencies函数做到这一点?

在另一种语言中,我会做一个for迭代从0max的整数,并且在该范围内的每个值x,查找(frequencies x)然后做repeat (frequencies x) x或其他东西。

至关重要的是,我需要在从最小到最高的顺序中执行此操作,这就是整个事情的一种选择。所以我不想只是map xs中的每个数字。

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

谢谢。

答案

更新向量不是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)))))
另一答案

那么你可以用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))))

以上是关于如何在Clojure中实现整数的计数排序?的主要内容,如果未能解决你的问题,请参考以下文章

在没有互斥体的 C++11 中实现共享整数计数器的最简单方法:

在clojure返回错误中实现范围函数

使用节点而不是整数在Java中实现基数排序

如何在javascript中实现多个项目的计数?

从片段中获取意图值后,我如何在 recyclerview 项目中实现单击

如何使用对象列表在片段中实现newinstace模式[重复]