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

C++编写的冒泡排序代码无法输出正确排序结果的原因排查

问题诊断

核心错误是内层循环的边界条件写反,导致比较交换的范围完全不符合冒泡排序的逻辑。
你现在写的内层循环条件是j < i,外层i从0递增到4的过程中:

  • i=0时内层循环直接不执行
  • i=1时j仅遍历下标0
  • i=2时j仅遍历下标0、1
  • 直到最后一轮,j也只能遍历到下标3,全程没有覆盖到完整的未排序区间,靠后的元素根本没法和前面的元素完成比较交换,自然得不到正确结果。

标准冒泡排序的逻辑是:每一轮外层循环,都会把当前未排序区间里的最大值,通过相邻交换“冒泡”到未排序区间的末尾。因此内层循环只需要遍历未排序的区间,不需要碰已经排好序的末尾部分,正确的边界应该是j < 5 - 1 - i:

  • 减1是因为每次比较j和j+1位置的元素,要避免j取到最后一个下标导致数组越界
  • 减i是因为每跑完一轮,末尾i个元素已经是排好序的状态,不需要重复比较
修正后可运行代码
#include <iostream>
using namespace std;
int main(){
    int numbers[5]={2,7,9,3,4};
    
    for(int i=0;i<5;i++){
        // 修正内层循环边界
        for(int j=0;j<5 - 1 - i;j++){
            if(numbers[j]>numbers[j+1]){
                int temp=numbers[j];
                numbers[j]=numbers[j+1];
                numbers[j+1]=temp;
            }
        }
    }
    for(int i=0;i<5;i++){
        cout<<numbers[i]<<endl;
    }
    return 0;
}
运行输出
2
3
4
7
9

可选优化:可以在内层循环外加一个布尔标记,记录当前轮有没有发生交换,如果某一轮一次交换都没做,说明数组已经完全有序,直接提前终止外层循环即可,能减少不必要的遍历开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:21:21