冒泡排序(bubbleSort)输出顺序异常,请求代码排查
冒泡排序问题排查与修复
我来帮你揪出这个冒泡排序的问题——核心是counter变量的逻辑完全写反了,导致排序只跑了一轮,这就是0没跑到最开头的原因。
问题分析
先拆解你的代码逻辑,看看哪里出了岔子:
- 初始循环触发:你把
counter初始设为-1,这能让第一次while(counter != 0)循环正常进入,这步没问题。 - 交换次数统计:进入循环后把
counter设为0,然后遍历数组交换逆序对,每交换一次counter++,这部分逻辑是对的。 - 致命错误:循环结束后的判断:
这里完全搞反了逻辑: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
相关产品推荐
相关产品推荐

