我需要编写一个对大小为[0..N-1]的数组进行排序的算法,该算法填充了范围[0..N-1]的值。数组中的值不能重复。排序应该在线性时间内工作,我只允许使用一些额外的变量。
plz评论我写的代码。据我猜,最糟糕的时间是2 * N.还是一个线性时间吗?是否有可能更快?
public int sort(){
int i = 0;
while (i < n){
if (a[i] != i)
switchElements(a[i], a[a[i]]);
else
i++;
}
return count;
}
额外1 我真的需要对数组进行排序,因为排序只是任务的一部分。完整的任务是找到数组中的重复值,线性时间,没有其他变量。
答案 0 :(得分:5)
回答原始问题:
包含非重复元素[0..N-1]
的元素[0..N-1]
的数组
为什么要排序?已排序的数组已知,并且为[0..N-1]
。
考虑您的额外1:您的算法看起来很好,您只需查看每个元素一次,并且必须至少查看一次,因此无法改善。此外2*N
也是O(N)
。
答案 1 :(得分:1)
为了检测重复项,您可以进一步扩展该逻辑,强制将值放入各自的位置。
public int sort(){
int i = 0;
while (i < n){
while (a[i] != a[a[i]])
switchElements(a[i], a[a[i]]);
++i;
}
return count;
}
最后,如果任何i
,i
和A[i]
不匹配则表示重复!
总的来说,它仍然是O(N)
程序
有关详细信息,请参阅以下帖子:
Finding duplicates in O(n) time and O(1) space