You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 05:51:02