所以我在考虑一种新的排序算法,它可能很有效但我对此并不太确定。
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)结果?我对此并不太确定,这也是我问你的原因。也许我甚至错过了一些非常重要的东西。
提前感谢您的帮助:)
答案 0 :(得分:3)
恭喜您独立重新发现counting sort。
对于范围有限的情况,这确实是一个非常好的排序策略,并且项目数量远远大于数组中项目的数量。
在范围大于数组中项目数的情况下,传统的排序算法会为您提供更好的性能。
此类算法称为pseudo-polynomial。
答案 1 :(得分:1)
我们应该得到一个O(n)结果
当第一个数组中的M - max数时,得到O(N + M)结果。另外,你花费O(M)内存,所以只有当M很小时它才有意义。见counting sort