使用索引进行排序是否有效?

时间:2017-09-02 17:04:28

标签: java arrays algorithm performance sorting

所以我在考虑一种新的排序算法,它可能很有效但我对此并不太确定。

  

1)想象一下,我们有一个只有正数的数组   2)我们通过阵列找到最大的数字n   3)我们创建一个大小为n + 1的新数组b   4)我们遍历未排序数组中的每个条目,并在我们正在查看的未排序数组的索引处增加第二个数组中的值。 (在伪代码中,这意味着:b [a [i]] ++;而a [i]是我们当前正在查看的数字)
  5)一旦我们用a中的每个元素完成了这个,数组b就在每个索引处存储这个索引的确切数量。 (例如:b [0] = 3表示我们在初始数组a)中有3个零   6)我们遍历整个数组b并跳过所有空字段并从中创建一个新的List或Array。

所以我可以想象这个算法对于较小的数字来说可以非常快速和高效,因为最后我们必须通过整个数组b来构建排序的数据,这将非常耗费时间。 /> 例如,如果我们有一个数组a = {1000,1},它仍会检查数组b中的1001个元素是否为0,即使我们在初始数组中只有2个元素,它们也是0。
数字较小但我们几乎得到O(n)结果?我对此并不太确定,这也是我问你的原因。也许我甚至错过了一些非常重要的东西。
提前感谢您的帮助:)

2 个答案:

答案 0 :(得分:3)

恭喜您独立重新发现counting sort

对于范围有限的情况,这确实是一个非常好的排序策略,并且项目数量远远大于数组中项目的数量。

在范围大于数组中项目数的情况下,传统的排序算法会为您提供更好的性能。

此类算法称为pseudo-polynomial

答案 1 :(得分:1)

  

我们应该得到一个O(n)结果

当第一个数组中的M - max数时,得到O(N + M)结果。另外,你花费O(M)内存,所以只有当M很小时它才有意义。见counting sort