为什么我不能以这种方式进行计数排序?

Joh*_*Lui 5 arrays sorting counting-sort

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

我采用的方法是:

  1. 遍历输入数组并按以下方式存储总计数 count[arr[i]]++

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

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

我的方法有问题吗?

谢谢!

Lit*_*his 5

当数组中比较相同的所有对象都相同时,您的方法很好。例如,在 array 中[ 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 }
]
Run Code Online (Sandbox Code Playgroud)

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

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