冒泡排序代码排错: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
相关产品推荐
相关产品推荐

