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

