在O(n)运行时排序数组

时间:2012-09-03 01:15:09

标签: algorithm sorting

如果您对内存没有任何限制,是否有任何算法可以在O(n)中对给定数组进行重复排序?

2 个答案:

答案 0 :(得分:11)

这取决于。如果您可以使用下限和上限(以及最大精度/值长度)以某种方式绑定输入,则可以使用O(n) O(n)。同样,Radix Sort在最佳情况下可能会O(n^2)复杂,但对于错误输入会降级为O(n log n)

但是,一般情况下,如果您无法限制输入并需要使用基于比较的排序,则可以证明{{1}}是最佳的。

当对固定精度整数或浮点数(通常高达64位)进行排序时,这些值实际上是有界的,并且可以进行基数排序。

即使值的最大位长有界,位长越长,常数越大。实际上,如果有要排序的n值,并且每个值的长度或精度可达m位,则算法复杂度为O(nm)。

答案 1 :(得分:2)

是。 如果您对空间复杂性没有任何限制,那么您可以使用o(n)时间复杂度对数组进行排序。

  • 假设你有一个k(let k = 10)元素的数组。
  • 并且(让)你的数组是:N [2,6,4,4,1,1,9,5,2,2]

  • 现在,作为我们的考虑,我们没有任何限制 空间。

  • 假设我们有一个二维数组(temp_number [i] [j]) 大小为p(理论上,认为p是无穷大的),使得在索引i上 包含一些标志,索引j包含链接列表。

现在,填充temp_number [] [],使得数组N的每个元素都放在temp_number [] []的索引中,并使flag = 1 否则保持flag = 0。

temp_number[0][1] = [1][1->1->null]
 temp_number[1][1] = [1][2->2->2->null]
 temp_number[2][1] = [0][3->null]
 temp_number[3][1] = [1][4->4->null]
 temp_number[4][1] = [1][5->null]
temp_number[5][1] = [1][6->null]
temp_number[6][1] = [0][null]
temp_number[7][1] = [0][null]
temp_number[8][1] = [1][9->null] & so on...
  • 现在,您可以在单循环中获取 flag = 1 的所有元素。
  • 注意,在这方面,我们并没有像

    那样

    if(number1> number2){// sort logic ...}

    所以,在这里你可以得到复杂度0(n),因为只有一个循环