【问题标题】:Would it be efficient to sort with indexes使用索引排序是否有效
【发布时间】:2018-02-11 11:01:56
【问题描述】:

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

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

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

【问题讨论】:

标签: java arrays algorithm performance sorting


【解决方案1】:

恭喜您独立重新发现counting sort

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

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

这种算法称为pseudo-polynomial

【讨论】:

  • 感谢您的回答。对不起,我不知道这个算法已经存在,就像我描述的那样。
【解决方案2】:

我们应该几乎得到 O(n) 的结果

当 M - 第一个数组中的最大数量时,您会得到 O(N+M) 结果。另外,您花费了 O(M) 内存,因此只有在 M 很小的情况下才有意义。见counting sort

【讨论】:

    猜你喜欢
    • 2011-10-15
    • 2020-05-20
    • 1970-01-01
    • 2019-12-06
    • 2011-05-14
    • 2014-12-21
    • 1970-01-01
    • 2023-01-12
    • 2010-10-14
    相关资源
    最近更新 更多