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

如何在C++中更高效地对矩阵进行排序?

优化矩阵排序的实现方案

你的思路是对的——把矩阵转成一维数组排序再转回去,但原代码的元素复制逻辑太绕,而且冒泡排序效率极低(时间复杂度O(n²)),可以从这几个方面优化:

1. 简化矩阵与一维数组的互转逻辑

原代码的复制逻辑用了复杂的条件判断,其实可以用更直观的索引计算或者简洁的循环遍历:

  • 从矩阵转数组:temp[i*col + j] = matrix[i][j]
  • 从数组转矩阵:matrix[i][j] = temp[i*col + j]

直接嵌套循环逐个复制的可读性更强,也不容易出错。

2. 用高效排序替代冒泡排序

C++标准库的std::sort是基于快速排序/归并排序实现的,时间复杂度O(n log n),比冒泡排序高效得多,直接调用标准库函数就行,不用自己写冗余的排序逻辑。

优化后的完整代码

#include <iostream>
#include <algorithm> // 引入std::sort

using namespace std;

int main() {
    const int row = 3; // 替换为你的实际行数
    const int col = 4; // 替换为你的实际列数

    // 矩阵初始化
    int matrix[row][col];
    for (int i = 0; i < row; ++i) {
        for (int j = 0; j < col; ++j) {
            cin >> matrix[i][j];
        }
    }

    // 矩阵转一维数组
    int temp[row * col];
    int idx = 0;
    for (int i = 0; i < row; ++i) {
        for (int j = 0; j < col; ++j) {
            temp[idx++] = matrix[i][j];
        }
    }

    // 调用标准库高效排序
    sort(temp, temp + row * col);

    // 排序后的数组转回矩阵
    idx = 0;
    for (int i = 0; i < row; ++i) {
        for (int j = 0; j < col; ++j) {
            matrix[i][j] = temp[idx++];
        }
    }

    // 可选:输出排序后的矩阵验证结果
    for (int i = 0; i < row; ++i) {
        for (int j = 0; j < col; ++j) {
            cout << matrix[i][j] << " ";
        }
        cout << endl;
    }

    return 0;
}

动态矩阵的优化方案

如果矩阵的行数和列数是运行时动态确定的,建议用std::vector替代静态数组,避免栈溢出问题,代码更灵活:

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main() {
    int row, col;
    cin >> row >> col;

    vector<vector<int>> matrix(row, vector<int>(col));
    for (int i = 0; i < row; ++i) {
        for (int j = 0; j < col; ++j) {
            cin >> matrix[i][j];
        }
    }

    // 矩阵转一维vector
    vector<int> temp;
    temp.reserve(row * col); // 预分配空间提升效率
    for (auto &row_vec : matrix) {
        temp.insert(temp.end(), row_vec.begin(), row_vec.end());
    }

    sort(temp.begin(), temp.end());

    // 转回矩阵
    auto it = temp.begin();
    for (auto &row_vec : matrix) {
        for (auto &elem : row_vec) {
            elem = *it++;
        }
    }

    // 输出结果
    for (auto &row_vec : matrix) {
        for (auto elem : row_vec) {
            cout << elem << " ";
        }
        cout << endl;
    }

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:10:32