首页 > 解决方案 > 根据c ++中的特定行对矩阵的列进行排序

问题描述

有没有一种简单的方法可以根据例如在 c++ 中对矩阵进行排序。第一行,以便所有元素相应地重新排列?

例子:

int matrix[3][3] = { {5,2,4},
                     {1,7,8},
                     {9,2,6} };

按第一行排序后,它看起来像这样:

{2,4,5},
{7,8,1},
{2,6,9}

最好,我想使用 sort() 函数,如果它会使任务更容易,我不介意使用向量。

标签: c++c++17

解决方案


正如评论所说,按列对矩阵进行排序比按行排序更容易,因为std::sort使用 lambda 函数将为前者完成工作。

我的建议是按行对列索引进行排序,然后使用排序后的索引来重建矩阵:

#include <algorithm>
using namespace std;
const int n = 3; // size of matrix
int sort_by_row = 0; // row to sort by
int original[n][n] = { {5,2,4},
                        {1,7,8},
                        {9,2,6} };
int main() {
    int col_indices[n];
    for (int i = 0; i < n; i++) col_indices[i] = i; // create column indices 0...n-1
    sort(col_indices, col_indices + n, [] (const int &a, const int &b) { // sort indices by row
        return original[sort_by_row][a] < original[sort_by_row][b];
    });
    
    int sorted[n][n]; // rebuild matrix
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            sorted[i][j] = original[i][col_indices[j]];
        }
    }
}

在这种方法中,您只对矩阵进行一次迭代,而如果您对矩阵进行转置、排序,然后将其转回,则对矩阵进行两次迭代(在转置期间)。


推荐阅读