C++矩阵行排序异常:按每行正偶数和重排矩阵行失效
问题分析与修正方案
原代码核心问题
- 排序逻辑完全错误:原代码中
matrix[i] < matrix[j]比较的是行数组的内存地址,而非每行正偶数的和,这导致排序结果完全不符合需求,表现为“随机乱序”。 - 无效冗余代码:
row_sum;和Sort;只是函数名,没有实际调用;未初始化的a数组及对应交换操作毫无意义,属于多余代码。 - 自定义排序实现粗糙:手动嵌套循环的排序逻辑既冗余又易出错,不如直接使用C++标准库的稳定排序实现。
修正后的完整代码
#include <iostream> #include <stdlib.h> #include <ctime> #include <algorithm> using namespace std; #define COLUMNS 4 // 替换原m,提升可读性 #define ROWS 3 // 替换原n,提升可读性 // 填充随机矩阵(1到max_val的整数) void fill_random(int matrix[ROWS][COLUMNS], int max_val) { for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLUMNS; j++) { matrix[i][j] = (rand() % max_val) + 1; } } } // 输出矩阵中所有正偶数 void find_even(int matrix[ROWS][COLUMNS]) { cout << "矩阵中的偶数:\n"; for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLUMNS; j++) { if (matrix[i][j] > 0 && matrix[i][j] % 2 == 0) { cout << matrix[i][j] << endl; } } } } // 计算单行的正偶数和(核心辅助函数) int calculate_even_sum(int row[COLUMNS]) { int sum = 0; for (int j = 0; j < COLUMNS; j++) { if (row[j] > 0 && row[j] % 2 == 0) { sum += row[j]; } } return sum; } // 输出每行的正偶数和 void print_row_even_sums(int matrix[ROWS][COLUMNS]) { for (int i = 0; i < ROWS; i++) { int sum = calculate_even_sum(matrix[i]); cout << "第 " << i << " 行偶数和 --> " << sum << endl; } } // 按每行正偶数和升序排序矩阵 void sort_matrix_by_even_sum(int matrix[ROWS][COLUMNS]) { // 转换为数组指针,适配std::sort的参数要求 int (*matrix_ptr)[COLUMNS] = matrix; // 使用lambda表达式作为比较器,直接比较两行的偶数和 sort(matrix_ptr, matrix_ptr + ROWS, [](int row1[COLUMNS], int row2[COLUMNS]) { return calculate_even_sum(row1) < calculate_even_sum(row2); // 若需降序排序,将<改为>即可 }); // 输出排序后的矩阵 cout << "排序后的矩阵:\n"; for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLUMNS; j++) { printf("%5d ", matrix[i][j]); } cout << "\n"; } } int main(void) { srand(time(NULL)); int matrix[ROWS][COLUMNS]; fill_random(matrix, 10); // 输出原矩阵 cout << "原矩阵:\n"; for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLUMNS; j++) { printf("%5d ", matrix[i][j]); } printf("\n"); } cout << endl; cout << "---------------------------------------- \n"; find_even(matrix); cout << "---------------------------------------- \n"; print_row_even_sums(matrix); cout << "---------------------------------------- \n"; sort_matrix_by_even_sum(matrix); return 0; }
关键改进点
- 清晰命名:将宏
m、n改为COLUMNS、ROWS,代码可读性大幅提升。 - 复用逻辑:新增
calculate_even_sum函数,统一处理单行偶数和计算,避免重复代码。 - 稳定排序:使用C++标准库
std::sort结合lambda比较器,直接基于每行偶数和排序,逻辑清晰且结果稳定。 - 冗余清除:移除原代码中所有无效操作,简化整体逻辑。
- 明确判断:增加
row[j] > 0条件,严格符合“正偶数”的需求描述。
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

