【问题标题】:How to sort a 2d matrix by column?如何按列对二维矩阵进行排序?
【发布时间】:2020-04-20 18:04:50
【问题描述】:

我有以下代码,其中我对插入列中的每个元素都排序一个二维矩阵。

例如:

5 4 

2 4 1 3
9 8 7 6
20 19 18 16
30 29 124 12
59 21 0 3
0 4 12 21 
1 6 16 29 
2 7 18 30 
3 8 19 59 
3 9 20 124 

我的第一种排序方法是这样的:

vector<vector<int>> w;
vector<int> v;
int n,m,x;

cin >> n >> m;
w.resize(n, vector<int>(m));

for(int i=1; i <= n*m; i++)
    cin >> x,v.push_back(x);

sort(v.begin(), v.end());
int k=0;

for(int i=0; i < m; i++)
{
    for(int j=0;j<n;j++)
        w[j][i]=v[k++];
}

for(int i=0; i < n; i++)
{
    for(int j=0;j<m;j++)
        cout << w[i][j] << " ";
    cout << '\n';
}

我的第二个:

for(int i=0;i<m;i++)
    for(int j=0;j<n;j++)
        for(int k=i;k<m;k++)
        {
            int l;
            if(i==k)
                l=j;
            else
                l=0;
            for(;l<n;l++)
                if(a[j][i]>a[l][k])
                    swap(a[j][i],a[l][k]);
        }

我的问题是:有没有更简单的方法来对二维矩阵进行排序,不使用两个向量,也不使用第二种方法 3- for(对于数千行来说太慢了)?

【问题讨论】:

    标签: c++ matrix vector


    【解决方案1】:

    不需要二维向量,您可以将一维向量显示为二维:

    int n,m;
    std::cin >> n >> m;
    std::vector<int> v;
    //v.reserve(n * m);
    for (int i = 0; i != n * m; i++) {
        int x;
        std::cin >> x;
        v.push_back(x);
    }
    std::sort(v.begin(), v.end());
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
            std::cout << v[j * n + i] << " ";
        std::cout << '\n';
    }
    

    Demo

    【讨论】:

    • 我没想到。谢谢
    猜你喜欢
    • 2013-07-03
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多