如果您对内存没有任何限制,是否有任何算法可以在O(n)中对给定数组进行重复排序?
答案 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)时间复杂度对数组进行排序。
并且(让)你的数组是:N [2,6,4,4,1,1,9,5,2,2]
现在,作为我们的考虑,我们没有任何限制 空间。
现在,填充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...
注意,在这方面,我们并没有像
那样if(number1> number2){// sort logic ...}
所以,在这里你可以得到复杂度0(n),因为只有一个循环。