C++数组二分查找取消排序前打印循环注释后出现0原因问询
问题成因分析
1. 核心错误:冒泡排序数组越界
你编写的冒泡排序内层循环终止条件存在逻辑错误:
for (int i = 0, Temp = 0; i < Size; i++) { if (Arr[i] > Arr[i+1]) { // 交换逻辑 } }
数组长度为Size时,合法下标范围是0 ~ Size-1,当i等于Size-1时,Arr[i+1]访问的是数组边界外的内存空间,属于C++中的未定义行为:
- 这块内存的存储值是不确定的,会受之前运行的代码影响
- 你打开注释的打印循环时,数组后方的这块内存刚好存储的是0,排序过程中这个0就会被交换进数组内部,就出现了你看到的“中间插0”的现象
- 你注释掉打印循环时,这块内存的值刚好是其他内容,暂时没有体现出异常,但本质还是错误的,换编译环境、运行时机都可能出现不可预期的问题
2. 修复方案
把冒泡内层循环的终止条件改为i < Size - Rep,既可以避免越界,还能优化冒泡排序的执行效率:
for (int Rep = 1; Rep <= Size-1; Rep++) { for (int i = 0, Temp = 0; i < Size - Rep; i++) { if (Arr[i] > Arr[i+1]) { Temp = Arr[i]; Arr[i] = Arr[i+1]; Arr[i+1] = Temp; } } }
3. 其他逻辑优化建议
你当前的二分查找逻辑也存在缺陷:
- 不需要循环Size次,正确的二分查找循环条件应该是
while(Low <= High) - 原有写法循环次数过多,会导致Low和High超出数组合法下标范围,引发第二次越界访问
修复后的二分查找逻辑参考:
while (Low <= High) { Mid = (Low + High) / 2; if (Arr[Mid] == Key) { Found = 1; break; } else if (Arr[Mid] < Key) { Low = Mid + 1; } else { High = Mid - 1; } }
内容的提问来源于stack exchange,提问作者NoName
相关产品推荐
相关产品推荐

