为什么移除key变量后插入排序的运行结果出现错误?
插入排序代码修改出错原因
核心问题是你修改后用到的arr[i]在循环过程中会被覆盖,和原代码中缓存的key早已不等价:
- 原代码中
key是进入内层循环前就缓存的独立变量,存储的是当前要插入的元素的原始值,整个内层移动元素的过程中key的值不会发生变化,是比较和最终插入的基准值。 - 删除line a直接用
arr[i]替换key后,进入while循环的第一个操作就是arr[j+1] = arr[j],第一次执行该语句时j = i-1,即j+1 = i,这一步直接把arr[i]的原始值覆盖为arr[i-1]的值,后续while条件判断、最终赋值用到的arr[i]已经不是你最初要插入的目标值。
举第一轮循环的实际运行过程为例:
i=1时,arr[i]原始值为3:
原逻辑:
key=3,判断arr[0]=4>3成立,执行arr[1] = 4,j减为-1,最后执行arr[0] = key=3,前两位排序后为[3,4],符合预期。
修改后逻辑:无key缓存,第一次判断arr[0]=4>arr[1]=3成立,执行arr[1] = arr[0] =4,此时arr[i]已经变成4,后续所有判断、赋值都是基于值为4的arr[i]执行,最终前两位变为[4,4],和你输出的开头重复4的现象一致。
后续的每一轮循环都会重复该问题,要插入的元素原始值被提前覆盖,最终就会出现大量重复值的错误输出。
内容的提问来源于stack exchange,提问作者amaan211
相关产品推荐
相关产品推荐

