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
相关产品推荐
相关产品推荐

