C++传值实现的bubbleSort冒泡排序函数无法生效问题求助
问题分析与修复方案
核心问题
- 参数为值传递:你当前定义的
bubbleSort函数的两个int参数属于值拷贝传递,函数内部对i、j的修改仅作用于函数栈内的临时副本,不会回写到main函数的numbers数组元素中,这是排序完全不生效的根本原因。 - 你当前的两层循环逻辑已经实现了选择排序的比较逻辑,只需要修复
bubbleSort的参数问题即可得到升序结果。
修复方案(满足不传递数组、仅传两个待比较元素的要求)
方案1:使用C++引用参数(推荐,代码改动最小)
修改bubbleSort的函数声明、定义,将参数改为引用类型,函数内修改会直接映射到原始变量:
#include <iostream> using namespace std; // 函数声明改为引用参数 void bubbleSort(int&, int&); int main(){ const int size = 10; int numbers[size] = { 100, 33, 49, 23, 84, 2, 72, 17, 82, 64 }; for (int i = 0; i < size; i++) { cout << numbers[i] << " "; } for (int i = 0; i < size; i++) { for (int j = i+1; j < size; j++) { bubbleSort(numbers[i], numbers[j]); } } cout << "\n"; for (int i = 0; i < size; i++) { cout << numbers[i] << " "; } return 0; } // 函数定义改为引用参数 void bubbleSort(int &i, int &j) { int temp; if (i > j) { temp = i; i = j; j = temp; } }
运行输出:
100 33 49 23 84 2 72 17 82 64 2 17 23 33 49 64 72 82 84 100
方案2:使用指针参数(严格传值逻辑,传递地址值)
如果要求参数必须是值传递类型,可以传递元素的地址值,仅需修改调用逻辑和函数定义即可:
#include <iostream> using namespace std; // 函数声明改为指针参数 void bubbleSort(int*, int*); int main(){ const int size = 10; int numbers[size] = { 100, 33, 49, 23, 84, 2, 72, 17, 82, 64 }; for (int i = 0; i < size; i++) { cout << numbers[i] << " "; } for (int i = 0; i < size; i++) { for (int j = i+1; j < size; j++) { // 传递元素地址 bubbleSort(&numbers[i], &numbers[j]); } } cout << "\n"; for (int i = 0; i < size; i++) { cout << numbers[i] << " "; } return 0; } // 函数定义改为指针参数 void bubbleSort(int *i, int *j) { int temp; if (*i > *j) { temp = *i; *i = *j; *j = temp; } }
运行结果和方案1一致。
内容的提问来源于stack exchange,提问作者kianhun4167 chai
相关产品推荐
相关产品推荐

