为何Java中未用correct变量的Cyclic Sort代码无法运行?
为什么直接使用
arr[i]-1的Cyclic Sort代码无法正常运行? 问题出在代码1的交换逻辑里,修改arr[i]后再用它计算索引会导致致命错误:
看代码1的交换步骤:
int temp = arr[i]; arr[i] = arr[arr[i] - 1]; // 这里已经修改了arr[i]的原始值 arr[arr[i] - 1] = temp; // 这里用的是修改后的arr[i]来计算索引,完全偏离了目标位置!
举个具体例子:假设当前arr[i]的值是3,那么原本要交换的索引是3-1=2。第一步执行后,arr[i]被替换成arr[2]的值(比如是5),这时候第二步计算arr[i]-1就变成了5-1=4,导致temp被放到了索引4的位置,完全不是原本该去的地方。
更严重的是,这种错误会让程序陷入死循环:因为元素始终没被放到正确位置,arr[i] != arr[arr[i]-1]的判断会一直成立,i永远不会递增,程序就卡在循环里不动,表现为无输出也无报错。
而代码2用correct变量提前存储了交换前的arr[i]-1值,后续交换全程使用这个固定的正确索引,不会因为arr[i]被修改而打乱逻辑,所以能正常完成排序。
内容的提问来源于stack exchange,提问作者Kanak Tanwar
相关产品推荐
相关产品推荐

