我有以下代码,其中我对插入到列中的每个元素排序2d矩阵。
例如:
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]);
}
我的问题是:没有一种简单的方法可以对2d矩阵进行排序,而不使用两个向量并且不像第二种方法3-那样使用(对于成千上万的行来说太慢了)?
答案 0 :(得分:2)
不需要2D向量,您可以将1D向量显示为2D:
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';
}