按线性时间排序?

时间:2009-04-14 22:25:08

标签: algorithm sorting complexity-theory time-complexity

给定[0..n ^ 3-1]范围内的n个整数的输入集,提供线性时间排序算法。

这是我星期四测试的评论,我不知道如何解决这个问题。

8 个答案:

答案 0 :(得分:23)

查看radix sort

答案 1 :(得分:22)

另请查看相关的排序:pigeonhole sortcounting sort,以及Pukku提到的radix sort

答案 2 :(得分:8)

当人们说“排序算法”时,他们经常指的是“比较排序算法”,这是任何只依赖于能够问“这个比这个更大还是更小”的算法。因此,如果您仅限于询问有关数据的这一个问题,那么您将永远不会获得超过n * log(n)(这是对数据集的n个阶乘可能排序进行log(n)搜索的结果) 。

如果您可以逃避“比较排序”的约束并询问关于某个数据的更复杂的问题,例如“这个数据的基数10基数是什么”那么您可以提出任意数量的线性时间排序算法,他们只需要更多的内存。

这是一个时间空间权衡。 Comparason排序很少或没有ram并且在N * log(n)时间内运行。基数排序(例如)在O(n)时间和O(log(基数))内存中运行。

答案 3 :(得分:3)

这很简单,如果n = 2且数字是唯一的:

  • 构造比特数组(2 ^ 31-1比特=> ~256MB)。将它们初始化为零。
  • 读取输入,对于您看到的每个值,将数组中的相应位设置为1。
  • 扫描阵列,为每个位集输出相应的值。

复杂性=> O(2N)

否则,请使用Radix Sort:

复杂性=> O(kn)(希望如此)

答案 4 :(得分:3)

wikipedia显示了许多不同的排序算法及其复杂性。你可能想看看它们

答案 5 :(得分:2)

一组有限的数字可以用RANGE位的位图表示。 在这种情况下,一个500mb的位图,所以对于除了巨大的列表之外的任何东西,你最好使用Radix Sort。当您遇到数字k时,设置位图[k] = 1.单遍历列表,O(N)。

答案 6 :(得分:2)

将数字视为三位数字,其中每个数字的范围为0到n-1。使用基数排序对这些数字进行排序。对于每个数字,都会调用计数排序,该计时采用Theta(n + n)时间,因此总运行时间对应于Theta(n)。

答案 7 :(得分:-2)

同样的算法是可能的:

M;// unsorted array
lngth; //number items of M
for(int i=0; i < lngth; i++)sorted[M[i]];

它本身可能是线性复杂度的算法,但它具有ram的复杂度O(k * N)(N - 数组元素,k - 元素的len)