我必须构建一个函数,按行排序矩阵,然后按列或其他方式对矩阵进行排序,保留矩阵内的值。 矩阵是一个巨大的矩阵,所以我使用的算法必须是一个nlogn算法。
我的结构如下:
typedef struct{
unsigned int line, column;
float value;}Matrix;
Matrix matrix[size_of_matrix*size_of_matrix];
static int numb_of_matrix; /*Whenever I ask the user to insert values to the matrix, I increase this number to insert the structure inside my vector matrix*/
我还存储由用户填充的行和列的maximun和minimun索引,并且这些边界之间的索引设置为0,因此我创建了一个size_of_matrix * size_of_matrix的矩阵,其中包含0和0以及然后我在那里插入我的值,同时存储用户填充的行和列的最高和最低索引。
鉴于此,我需要通过按行的递增顺序排序,然后按列的递增顺序排序,或者相反的方式对矩阵进行排序。 我必须知道我必须对矩阵进行排序的方式是要求用户输入C,如果我需要先按行排序矩阵,如果我需要先按行排序矩阵。 / p>
所以如果我已经向矩阵介绍了以下内容:
[0,3]=1.2
[3,0]=2.1
[4,5]=2.2
[2,5]=3.2
[3,5]=4.2
然后我先按行排序,它应该成为
[0,3]=1.2
[2,5]=3.2
[3,0]=2.1
[3,5]=4.2
[4,5]=2.2
如果矩阵足够小,这个问题会很快解决,但我的矩阵将有近100万个值,所以我不能使用冒泡排序或任何其他n ^ 2排序算法。< / p>
答案 0 :(得分:0)
您保存矩阵的格式称为三元组格式。按行或列顺序对它们进行排序意味着将它们保存为压缩稀疏列(CSC)或压缩稀疏行(CSR)格式。 大多数稀疏库都有效地实现了它们。将CSC转换为CSR或反之亦然只是一个矩阵转置。如果您正在寻找一个小型高效代码,您可以查看&#34; cs_transpose&#34; SuiteSparse / CSparse中的函数。 对于将三元组转换为任何压缩形式,就像这样。计算每行/每列中元素的数量,然后按顺序将它们放在正确的位置(如桶排序)。该算法将bo O(n),但行/列中的元素未排序。 一个简单的解决方案是转置它们。实际使用了两次转置!