【发布时间】:2012-11-01 05:48:28
【问题描述】:
我需要编写一个对大小为 [0..N-1] 的数组进行排序的算法,该数组填充了范围 [0..N-1] 的值。数组中的值不能重复。排序应该在线性时间内进行,我只允许使用一些额外的变量。
请评论我写的代码。据我猜测,最糟糕的时间是 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 我真的需要对数组进行排序,因为排序只是任务的一部分。完整的任务是在线性时间内查找数组中是否存在重复值,并且没有其他变量。
【问题讨论】:
-
2*N 肯定是线性时间
-
算法的效果还不是很明显。
-
您可能需要改写部分问题,因为您声明“数组中的值不能重复”,但后来“全部任务是查找数组中是否存在重复值” .是否存在重复项,你不能同时拥有这两者......不过,我认为诀窍可能是意识到
[0, N-1]范围内没有重复项的N元素数组意味着每个范围内的数字恰好出现一次,因此排序后的结果就是序列0 ... N-1。 -
任务是找到重复的键。所以,考虑到没有重复值,我将对数组进行排序。但是在切换元素之前,我要检查单元格中的值是否已经是正确的值并在这种情况下抛出消息
-
@user1448906 看起来不错。我认为没有更有效的方法来做到这一点。