稀疏矩阵的转置,用双重for循环很容易就完成了,但是时间复杂度太高,所以今天我就来分享一个快速转置的方法
#include<iostream>
using namespace std;
typedef struct Link1
{
int col, row;
int data;
}Link1;
typedef struct Link2
{
int m, n, t;
Link1 T[5000];
}Link2;
int main()
{
//输入行数m、列数n。
Link2 NUM;
cin >> NUM.m >> NUM.n;
int data = 0;
int t = 1;
int num[5000] = { 0 };
//num数组是用来记录每一列非0元素的个数的
NUM.t = 0;
for (int i = 0; i < NUM.m; i++)
{
for (int j = 0; j < NUM.n; j++)
{
cin >> data;
if (data != 0)
{
num[j]++;
NUM.T[t].col = i;
NUM.T[t].row = j;
NUM.T[t].data = data;
NUM.t++;//代表三元表元素个数
t++;
}
}
}
int k[5000] = { 0 };//k数组则是显示将原三元组放进新的三元组的正确位置的下标
for (int i = 1; i <= NUM.n; i++)
{
k[i] = k[i - 1] + num[i - 1];
}
Link2 count;
count.m = NUM.m;
count.n = NUM.n;
count.t = NUM.t;
for (int i = 0; i < count.n; i++)
{
for (int j = 1; j <= count.t; j++)
{
if (NUM.T[j].row == i)
{
count.T[k[i]].col = NUM.T[j].row;
count.T[k[i]].row = NUM.T[j].col;
count.T[k[i]].data = NUM.T[j].data;
k[i]++;
}
}
}
int len = 0;
for (int i = 0; i < count.n ; i++)
{
for (int j = 0; j < count.m; j++)
{
if (i == count.T[len].col && j == count.T[len].row)
{
cout << count.T[len].data << " ";
len++;
}
else
cout << 0<<" ";
}
cout << endl;
}
return 0;
}