求助:如何用Bubble Sort对二维数组每行最大值列表升序排序?
问题分析与修正方案
嘿,我帮你找出问题所在了!你的核心问题是没有把每行的最大值存储到一个专门的数组里,而且冒泡排序的逻辑和语法都错了。咱们一步步来修正:
你的代码里的关键错误:
- 提取每行最大值时,
max是循环内的局部变量,每次循环都会被覆盖,根本没法保存所有行的最大值,自然没法对“最大值列表”排序。 - 冒泡排序部分的语法完全错误(比如
max+[1]这种写法根本不合法),循环条件用rows++会导致死循环,而且循环的维度也搞错了(应该针对最大值数组的长度,也就是行数,而不是列数)。
修正后的完整代码
#include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main() { int i, j, rows, columns, temp; // 初始化随机数种子,确保每次运行生成不同的随机数 srand(time(0)); // 获取用户输入的行数和列数 cout << "How many rows? "; cin >> rows; cout << "How many columns? "; cin >> columns; // 创建二维数组(注:C++标准不支持变长数组,若编译器不支持可改用动态分配或vector) int array[rows][columns]; // 填充二维数组为10-90的随机数 for (i = 0; i < rows; i++) { for (j = 0; j < columns; j++) { array[i][j] = rand() % 81 + 10; // 修正随机数范围:10-90(原代码会生成10-99) } } // 打印原始二维数组 cout << "\nOriginal 2D Array:\n"; for (i = 0; i < rows; i++) { for (j = 0; j < columns; j++) { cout << array[i][j] << " "; } cout << endl; } // 创建数组存储每行的最大值 int max_values[rows]; // 提取每行的最大值并存入max_values数组 for (i = 0; i < rows; i++) { max_values[i] = array[i][0]; // 初始化当前行最大值为第一个元素 for (j = 1; j < columns; j++) { // 从第二个元素开始比较 if (max_values[i] < array[i][j]) { max_values[i] = array[i][j]; } } cout << "\nLargest element in row " << i << " is: " << max_values[i]; } // 用冒泡排序对max_values数组进行升序排序 cout << "\n\nSorting the max values using Bubble Sort...\n"; for (i = 0; i < rows - 1; i++) { // 外层循环:排序轮数,最多需要rows-1轮 bool swapped = false; // 标记本轮是否有交换,优化冒泡排序 for (j = 0; j < rows - i - 1; j++) { // 内层循环:每轮比较到未排序的最后一个元素 if (max_values[j] > max_values[j + 1]) { // 交换两个元素 temp = max_values[j]; max_values[j] = max_values[j + 1]; max_values[j + 1] = temp; swapped = true; } } if (!swapped) { break; // 如果本轮没有交换,说明已经有序,提前结束 } } // 打印排序后的最大值列表 cout << "\nSorted Max Values (Ascending Order):\n"; for (i = 0; i < rows; i++) { cout << max_values[i] << " "; } cout << endl; return 0; }
额外说明:
- 随机数范围修正:你之前的
rand()%90+10会生成10到99的数,不符合10-90的需求,所以改成rand()%81+10(90-10+1=81,取模81得到0-80,加10后正好是10-90)。 - 变长数组兼容性:C++标准不支持
int array[rows][columns]这种变长数组,如果你的编译器不支持,建议改用new动态分配内存或者vector容器。 - 冒泡排序优化:加入了
swapped标记,若某一轮没有发生交换,说明数组已经有序,可以提前退出循环,提升排序效率。
内容的提问来源于stack exchange,提问作者Deviker
相关产品推荐
相关产品推荐

