使用0到9999之间的元素对数组进行排序

时间:2011-04-26 11:20:22

标签: c++ algorithm

我最近偶然发现了一个C ++问题。到此为止。

  

假设您知道整数数组中的所有值都落在0到9999的范围内。   表明可以编写O(N)算法来对具有此限制的数组进行排序

根据我的理解,O(N)的算法是您经过N次特定O(1)操作的算法。现在,对于我的生活,我无法理解你将如何编写一个程序来排序相对于O(N)的数字数组。以最基本的形式进行排序包括将数字相互比较,并且没有算法在一次迭代中完成,最后是一个排序数组。

在问题中,它指出该数组的元素只能具有0-9999范围内的值。我可以从这个问题中理解这个限制是什么使得整个事情成为可能,我应该在我的算法中使用它来达到解决方案。但我仍然无处可去。我所知道的所有排序算法(选择,插入,合并,快速...)都具有大于O(N)的运行时间,最小值为O(log N)。

我可以理解,其中一些算法的运行时间可能为O(N),但仅限于最佳情况。但我不认为在这方面会问这个问题。

如果有人能够对这个问题有所了解,我将不胜感激。

5 个答案:

答案 0 :(得分:5)

Radix sort。 O(4n)是O(n)。

答案 1 :(得分:5)

计算排序(请参阅http://en.wikipedia.org/wiki/Counting_sort)。只有比较分类是Omega(n lg n)。

答案 2 :(得分:2)

  1. 将10000个整数的数组counts初始化为0。
  2. 在每次迭代中迭代数据数组a并增加counts[a[i]]
  3. 迭代counts并将值counts[i]的{​​{1}}次添加到输出数组。

答案 3 :(得分:0)

建议:您有10,000个可能的值。如果创建一个包含计数的10000个整数数组,则可以填充该数组,迭代原始数组,然后从该临时数据重建一个新的排序数组。

答案 4 :(得分:0)

  1. 分配等于10000
  2. 的比特阵列
  3. 阅读输入
  4. 设置您正在阅读的数字的位索引相等值。
  5. 再次阅读bitarray。如果该位已设置,那么该索引(如果您的数字按排序顺序。