【问题标题】:Why can't I do the counting sort this way?为什么我不能以这种方式进行计数排序?
【发布时间】:2015-07-06 23:55:22
【问题描述】:

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

我采用的方法是:

  1. 遍历输入数组并将总计数存储为count[arr[i]]++

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

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

我的方法有什么问题吗?

谢谢!

【问题讨论】:

  • 我注意到Wikipedia article on counting sort 在最后一个循环中增加了计数,而不是像上面提到的那样减少它。如您所述,Geeksforgeek's counting sort page 减少计数。他们都对输入数据进行排序,但我认为不同之处在于相同排序的项目是以输入顺序还是反向输入顺序打印(例如,在我下面的答案中,它是否打印“... dragonfruit watermelon ...”或“。 ..西瓜火龙果...”)。

标签: arrays sorting counting-sort


【解决方案1】:

当您的数组中比较相同的所有对象都相同时,您的方法很好。例如,在数组[ 8, 2, 3, 5, 4, 3 ] 中,两个3s 是相同的,因此在排序结果中打印两次哪个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 }
]

如果你按数量对这个数组进行排序,dragonfruit 和 watermelon 将被放置在同一个 bin 中,3。但是,当循环 bins 时,你不能只打印两次 dragonfruit 来生成排序结果。取而代之的是,通过在算法中间插入一个循环来计算每个 bin 的前缀和,它将算法推广到对可能不同但比较相等的对象进行操作,因此它会打印一次火龙果和一次西瓜。

Wikipedia page forcounting sort 的Variant algorithms 部分提到了您的优化,说当被排序的项目是整数时,可以组合第二个和第三个循环。

【讨论】:

  • 对。知道了。火龙果和西瓜的惊人解释。非常感谢您的帮助。真的很感激。 :)
  • 你能告诉我为什么计数排序的复杂性是O(n+k)。不应该只是O(n),因为我们遍历输入数组一次,然后遍历count 数组,这将是O(k)
  • @JohnLui 正如你所说,复杂度是O(n),后跟O(k),也就是O(n) + O(k),也就是O(n+k)。维基百科页面也在标题 Analysis 下更详细地讨论了这一点。
猜你喜欢
  • 1970-01-01
  • 2021-06-21
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-26
  • 1970-01-01
  • 2017-06-12
相关资源
最近更新 更多