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

C语言冒泡排序代码陷入无限循环及打印异常问题排查

修复冒泡排序的sort函数问题

你的sort函数存在两个核心问题:

  • 数组越界访问:原代码中for (i = 0; i < last_i; i++)会导致当i等于last_i - 1时,ptr[i+1]访问数组范围外的内存(数组有效下标是0到N-1),这会引发未定义行为。
  • 循环逻辑混乱:last_i--被放在了for循环的每次迭代里,导致每比较一次就缩小一次排序范围,完全违背了冒泡排序“每轮把最大元素沉到末尾,然后缩小一轮排序范围”的逻辑,这也是引发异常的关键原因。

修复后的sort函数代码:

void sort(int *ptr, int N)
{
    int i = 0;
    int last_i = N;
    int temp = 0;
    // 标志位:判断本轮是否有交换,优化排序效率
    int swapped;
    while (last_i > 1)
    {
        swapped = 0;
        // 每轮只比较到last_i - 2,避免i+1越界
        for (i = 0; i < last_i - 1; i++)
        {
            if (ptr[i] > ptr[i + 1])
            {
                temp = ptr[i];
                ptr[i] = ptr[i + 1];
                ptr[i + 1] = temp;
                swapped = 1;
            }
        }
        // 每轮结束后,最大的元素已经在末尾,缩小排序范围
        last_i--;
        // 如果本轮没有交换,说明数组已经有序,提前退出
        if (!swapped)
            break;
    }
}

改动说明:

  1. 把last_i--移到for循环外面,每完成一轮比较后再缩小排序范围,符合冒泡排序的核心逻辑。
  2. 把for循环的条件改成i < last_i - 1,确保i+1不会超出数组的有效下标范围。
  3. 添加了swapped标志位,当某一轮没有发生任何交换时,说明数组已经完全有序,可以提前终止循环,提升排序效率。

配合你更新后的main函数运行,就能正常输出排序后的整数数组了。

内容的提问来源于stack exchange,提问作者Neronimo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:43:14