我最近偶然发现了一个C ++问题。到此为止。
假设您知道整数数组中的所有值都落在0到9999的范围内。 表明可以编写O(N)算法来对具有此限制的数组进行排序
根据我的理解,O(N)的算法是您经过N次特定O(1)操作的算法。现在,对于我的生活,我无法理解你将如何编写一个程序来排序相对于O(N)的数字数组。以最基本的形式进行排序包括将数字相互比较,并且没有算法在一次迭代中完成,最后是一个排序数组。
在问题中,它指出该数组的元素只能具有0-9999范围内的值。我可以从这个问题中理解这个限制是什么使得整个事情成为可能,我应该在我的算法中使用它来达到解决方案。但我仍然无处可去。我所知道的所有排序算法(选择,插入,合并,快速...)都具有大于O(N)的运行时间,最小值为O(log N)。
我可以理解,其中一些算法的运行时间可能为O(N),但仅限于最佳情况。但我不认为在这方面会问这个问题。
如果有人能够对这个问题有所了解,我将不胜感激。
答案 0 :(得分:5)
Radix sort。 O(4n)是O(n)。
答案 1 :(得分:5)
计算排序(请参阅http://en.wikipedia.org/wiki/Counting_sort)。只有比较分类是Omega(n lg n)。
答案 2 :(得分:2)
counts
初始化为0。a
并增加counts[a[i]]
。counts
并将值counts[i]
的{{1}}次添加到输出数组。答案 3 :(得分:0)
建议:您有10,000个可能的值。如果创建一个包含计数的10000个整数数组,则可以填充该数组,迭代原始数组,然后从该临时数据重建一个新的排序数组。
答案 4 :(得分:0)