You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

关键改进点

  1. 清晰命名:将宏m、n改为COLUMNS、ROWS,代码可读性大幅提升。
  2. 复用逻辑:新增calculate_even_sum函数,统一处理单行偶数和计算,避免重复代码。
  3. 稳定排序:使用C++标准库std::sort结合lambda比较器,直接基于每行偶数和排序,逻辑清晰且结果稳定。
  4. 冗余清除:移除原代码中所有无效操作,简化整体逻辑。
  5. 明确判断:增加row[j] > 0条件,严格符合“正偶数”的需求描述。

内容的提问来源于stack exchange,提问作者Alexander

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 23:27:45