C++冒泡排序输出异常及数组长度获取问题求助
C++冒泡排序错误排查与解决方案
错误点分析
内存越界与逻辑错误
- 原数组
myArr包含10个元素,但调用bubbleSort时传入长度为8,仅排序了前8个元素,遗漏后两个元素。 bubbleSort返回数组首元素值,你将其赋值给单个int变量newArr,随后调用printArray(&newArr, 8)时,从单个int的地址读取8个int值,后7个均为内存随机垃圾数据,这是输出异常的核心原因——你根本没打印排序后的原数组。
- 原数组
冒泡排序效率冗余
内层循环无需每次遍历到数组末尾,每轮冒泡会将当前最大元素移至末尾,因此内层循环应改为j < length - 1 - i,跳过已排序的尾部元素。
此外bubbleSort返回单个元素无意义,排序直接修改原数组,改为void类型更合理。
修正后的代码
#include <iostream> void printArray(int *myArr, int length) { for (int i = 0; i < length; ++i) { std::cout << myArr[i]; if (i != length - 1) { std::cout << ", "; } } std::cout << std::endl; } void bubbleSort(int *myArr, int length) { for (int i = 0; i < length; ++i) { // 优化内层循环,跳过已排序的末尾元素 for (int j = 0; j < length - 1 - i; ++j) { if (myArr[j] > myArr[j+1]) { int temp = myArr[j]; myArr[j] = myArr[j+1]; myArr[j+1] = temp; } } } } int main() { int myArr[] = {10,14,13,19,15,12,16,18,17,11}; // 计算数组实际长度:总字节数/单个元素字节数 int arrLength = sizeof(myArr) / sizeof(myArr[0]); bubbleSort(myArr, arrLength); printArray(myArr, arrLength); return 0; }
函数中获取数组长度的简便方法
- 手动传递长度参数:最常用的方式,调用函数时同步传入数组长度,如你原代码的写法。
- 模板函数推导长度:利用模板推导原生数组的大小,无需手动传参:
template <size_t N> void bubbleSort(int (&myArr)[N]) { for (int i = 0; i < N; ++i) { for (int j = 0; j < N - 1 - i; ++j) { if (myArr[j] > myArr[j+1]) { std::swap(myArr[j], myArr[j+1]); } } } } // 调用示例:bubbleSort(myArr); - 使用std::array替代原生数组:
std::array自带size()方法获取长度,类型更安全:#include <array> std::array<int, 10> myArr = {10,14,13,19,15,12,16,18,17,11}; // 直接获取长度 bubbleSort(myArr.data(), myArr.size());
内容的提问来源于stack exchange,提问作者serhatdogan
相关产品推荐
相关产品推荐

