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

冒泡排序代码排错:tab排序正常但tab2排序结果异常

问题定位与修复

1. 排序算法逻辑错误

你的sort函数逻辑存在问题,这是tab2排序失败的核心原因:

  • 当前写法中,外层循环从数组头遍历到尾,内层循环从i+1开始到数组尾,每次比较j-1和j位置的元素并交换。这种方式无法保证元素被正确归位——仅能在第一轮把最大元素推到数组末尾,但后续循环无法彻底整理前面的元素,元素数量较多的数组(比如tab2)就会出现乱序。
  • tab排序正确只是巧合,因为它元素数量少、初始分布特殊,刚好被错误逻辑"凑"成了有序结果。

正确的冒泡排序实现应该是每轮将当前未排序区域的最大元素"冒泡"到末尾,外层循环控制未排序区域的边界:

void sort(int* begin, int* end) {
    // 外层循环:未排序区域的右边界,从末尾向头部收缩
    for (int* i = end - 1; i > begin; --i) {
        bool swapped = false;
        // 内层循环:从头遍历到未排序区域的前一个位置
        for (int* j = begin; j < i; ++j) {
            if (*j > *(j + 1)) {
                std::swap(*j, *(j + 1));
                swapped = true;
            }
        }
        // 一轮无交换说明数组已完全有序,提前退出循环
        if (!swapped) break;
    }
}

2. 数组范围的额外问题(非乱序主因,但需注意)

你定义的tab2包含16个元素,但调用sort和write时仅处理了前15个,最后一个元素-100被忽略。如果这不是你的预期,可以将参数改为tab2 + 16和16,从而处理全部元素。

修复后验证

替换sort函数后重新运行:

  • tab的排序结果依然正确;
  • tab2的前15个元素会输出有序序列:0 1 1 3 4 4 5 6 6 6 7 7 8 9 9;若处理全部16个元素,-100会排在序列最开头。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 06:27:50