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

冒泡排序(bubbleSort)输出顺序异常,请求代码排查

冒泡排序问题排查与修复

我来帮你揪出这个冒泡排序的问题——核心是counter变量的逻辑完全写反了,导致排序只跑了一轮,这就是0没跑到最开头的原因。

问题分析

先拆解你的代码逻辑,看看哪里出了岔子:

  1. 初始循环触发:你把counter初始设为-1,这能让第一次while(counter != 0)循环正常进入,这步没问题。
  2. 交换次数统计:进入循环后把counter设为0,然后遍历数组交换逆序对,每交换一次counter++,这部分逻辑是对的。
  3. 致命错误:循环结束后的判断:
    if (counter > 0) {
        counter = 0;
    } else if (counter == 0) {
        return 0;
    }
    
    这里完全搞反了逻辑:
    • 如果counter>0,说明本轮发生了交换,数组还没排好序,应该让循环继续执行,而不是把counter设为0(这样下一轮while条件counter !=0就不满足,直接退出了)。
    • 如果counter==0,说明本轮没有任何交换,数组已经完全有序,这时候才应该退出循环。

为什么0会卡在9和10之间?因为你的代码只执行了一轮冒泡排序:第一轮里0从原数组的第11位(索引10)往前交换,直到遇到9(交换后0到了索引9的位置),然后因为counter>0被设为0,循环直接终止,后续的排序轮次根本没执行,0自然没法继续往前交换到开头。

修复后的代码

#include <iostream>
#include <utility>
using namespace std;

int main() {
    int arr[] = { 2,1,3,5,4,7,6,9,8,10,0,12,11,14,15,13 };
    // 用sizeof(arr[0])代替硬编码的4,兼容性更好
    int n = sizeof(arr) / sizeof(arr[0]);
    // 初始设为非0值,触发第一次循环
    int counter = 1;

    while(counter != 0) {
        counter = 0; // 每次循环开始重置交换次数
        for (int i = 0; i < n - 1; i++) {
            if (arr[i] > arr[i + 1]) {
                swap(arr[i], arr[i + 1]);
                counter++;
            }
        }
        // 如果counter为0,说明没有交换,数组有序,循环会自动退出
    }

    // 输出排序后的数组,匹配你描述的分隔符样式
    for (int j = 0; j < n; j++) {
        cout << arr[j];
        if (j != n - 1) cout << "-";
    }
    cout << endl;
    system("Pause");
    return 0;
}

关键修复点

  • 修正了counter的逻辑:每次循环开始重置为0,统计交换次数;如果counter>0,下一轮while循环会继续执行;如果counter==0,循环自动终止。
  • 把数组长度计算改成sizeof(arr)/sizeof(arr[0]),避免依赖int的字节数,适配更多编译环境。
  • 调整了输出格式,让结果符合你描述的1-2-3...样式,避免最后一个元素后出现多余分隔符。
  • 把return 0移到main函数末尾,确保排序完成后能正常输出数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:11:09