为什么我不能用这种方式进行计数呢?

时间:2015-07-06 13:02:54

标签: arrays sorting counting-sort

计数排序基本上是将计数值存储在哈希表排序结构中,然后打印出值。

我采用的方法是:

  1. 遍历输入数组并按count[arr[i]]++

  2. 存储总计数
  3. 再次遍历count数组并打印i(th)索引号,与count[arr[i]]中的值一样多。这不是正确的方法吗?

  4. 我阅读教程的大部分地方都存储了count数组中先前元素的总和,然后通过先减少计数然后打印它来放置在排序数组中。

    我的方法有什么问题吗?

    谢谢!

1 个答案:

答案 0 :(得分:2)

当阵列中比较相同的所有对象相同时,您的方法很好。例如,在数组[ 8, 2, 3, 5, 4, 3 ]中,两个3都是相同的,因此在排序结果中打印两次3并不重要。但请考虑以下JSON数组:

[
    { "name": "apple", "quantity": 8 },
    { "name": "banana", "quantity": 2 },
    { "name": "dragonfruit", "quantity": 3 },
    { "name": "kiwifruit", "quantity": 5 },
    { "name": "pineapple", "quantity": 4 },
    { "name": "watermelon", "quantity": 3 }
]

如果按数量对此数组进行排序,则将龙果和西瓜放在同一个垃圾箱中,然而,当在垃圾箱上循环时,您不能只打印龙果两次以生成排序结果。相反,通过在算法的中间插入一个循环来计算每个bin的前缀和,它推广算法以对可能不同但比较相等的对象进行操作,因此它会打印一次dragonfruit和西瓜一次。

用于计算排序的维基百科页面的Variant algorithms部分提到了您的优化,并说当被排序的项目是整数时,可以组合第二个和第三个循环。