按频率排序

时间:2013-06-24 07:10:58

标签: arrays algorithm sorting

我想按频率对数组中的元素进行排序。

Input: 2 5 2 8 5 6 8 8 

Output: 8 8 8 2 2 5 5 6

现在解决这个问题的方法是:

  • 使用快速排序或合并排序对元素进行排序。 O(nlogn)
  • 通过扫描已排序的数组构建一个元素和计数的2D数组。为O(n)
  • 根据计数对构建的2D数组进行排序。 O(nlogn)

在我读过的其他可能的方法中,一个使用二进制搜索树,另一个使用哈希。

有人能建议我更好的算法吗?我知道复杂性无法降低。但我想避免这么多的遍历。

1 个答案:

答案 0 :(得分:1)

您可以在不对数组进行排序的情况下对数组执行一次传递,并在单独的结构上计算您找到元素的次数。如果您知道要找到的元素的范围,或者在哈希表上,则可以在单独的数组上完成此操作。无论如何,这个过程都是O(n)。然后,您可以使用每个元素关联的数量作为排序参数来执行生成的第二个结构(您有计数的位置)。第二个过程是,正如你所说的O(nlogn),如果你选择一个合适的算法。

对于第二阶段,我建议通过优先级队列使用堆排序。您可以告诉队列按count属性(在第一步计算的那个)对元素进行排序,然后逐个添加元素。完成添加后,队列将已经排序,算法具有所需的复杂性。要检索你的元素,你只需要开始弹出。

相关问题