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

C++冒泡排序算法实现求助:数组排序函数返回结果异常

修复你的C++冒泡排序实现问题

嘿,看来你的冒泡排序代码没正常工作啊,输出的数组还是乱的。咱们来揪出常见的问题点,然后给出能正确运行的实现方案!

先说说你的代码可能踩的坑

从你给出的输出{8,4,9,7,6,5,13,11,10}来看,大概率是这几个地方出了问题:

  • 数组长度计算错误:当你把数组作为参数传给函数时,C++会把它转换成指针,这时候用sizeof(arr)/sizeof(arr[0])得到的根本不是数组的真实长度,而是指针大小除以单个元素的大小,结果完全不对。
  • 循环边界没写对:冒泡排序每一轮都会把最大的元素“推”到末尾,所以内层循环的比较次数应该每轮递减,不然会重复比较已经排好的元素,甚至可能越界。
  • 返回数组的方式有问题:C++里不能直接返回数组,如果你硬返回指针,很容易遇到内存管理的问题,或者因为数组是栈上分配的导致后续访问出问题。

推荐的修正方案:用std::vector实现(更符合C++风格)

std::vector能完美解决数组传参的退化问题,还能安全返回排序后的结果,代码也更简洁:

#include <vector>
#include <algorithm> // 用于std::swap

std::vector<int> bubbleSort(std::vector<int> arr) {
    int n = arr.size();
    // 外层循环:控制排序轮数,每轮确定一个最大元素的位置
    for (int i = 0; i < n - 1; ++i) {
        // 标记本轮是否发生交换,没交换说明数组已经有序,提前退出
        bool swapped = false;
        // 内层循环:只比较未排序的部分,每轮少比i次(末尾i个已经有序)
        for (int j = 0; j < n - i - 1; ++j) {
            if (arr[j] > arr[j + 1]) {
                std::swap(arr[j], arr[j + 1]);
                swapped = true;
            }
        }
        // 优化:提前终止排序
        if (!swapped) {
            break;
        }
    }
    return arr;
}

测试代码

把你的测试数组放进去跑一跑,就能得到正确的排序结果了:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> arr = {8,4,9,7,6,5,13,11,10};
    std::vector<int> sortedArr = bubbleSort(arr);
    
    std::cout << "{ ";
    for (int num : sortedArr) {
        std::cout << num << " ";
    }
    std::cout << "}" << std::endl;
    // 输出结果:{ 4 5 6 7 8 9 10 11 13 }
    return 0;
}

如果一定要用原始数组(不推荐,但可以实现)

要是你坚持用C风格的数组,记得一定要把数组长度作为参数传给排序函数,避免长度计算错误:

#include <iostream>

void bubbleSort(int arr[], int n) {
    for (int i = 0; i < n - 1; ++i) {
        bool swapped = false;
        for (int j = 0; j < n - i - 1; ++j) {
            if (arr[j] > arr[j + 1]) {
                // 手动交换元素,也可以用std::swap
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                swapped = true;
            }
        }
        if (!swapped) break;
    }
}

int main() {
    int arr[] = {8,4,9,7,6,5,13,11,10};
    int n = sizeof(arr)/sizeof(arr[0]); // 这里在main里计算是对的,因为arr还是数组类型
    bubbleSort(arr, n);
    
    std::cout << "{ ";
    for (int i = 0; i < n; ++i) {
        std::cout << arr[i] << " ";
    }
    std::cout << "}" << std::endl;
    return 0;
}

这个版本里,我们在main函数里计算数组长度(这里是对的,因为arr在main里还是数组类型,不是指针),然后把长度传给排序函数,这样就能正确控制循环次数了。

内容的提问来源于stack exchange,提问作者Marwan El Sharkawy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:07:24