【问题标题】:Sorting a matrix by column and by row按列和按行对矩阵进行排序
【发布时间】:2018-04-25 12:08:08
【问题描述】:

我必须构建一个函数,按行排序矩阵,然后按列或其他方式,保留矩阵内的值。 矩阵是一个巨大的矩阵,所以我使用的算法必须是 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*/

我还存储了用户填充的行和列的最大和最小索引,并且这些边界之间的索引设置为 0,所以我创建了一个 size_of_matrix*size_of_matrix 的矩阵,全为 0,然后我插入我的值,同时存储用户填充的行和列的最高和最低索引。

鉴于此,我需要先按行的升序排序,然后按列的升序排序,或者反过来。 我必须知道我必须以哪种方式对矩阵进行排序的方式是,如果我需要先按列对矩阵进行排序,或者如果我需要先按行对矩阵进行排序,则询问用户输入 C。

因此,如果我向矩阵介绍了以下内容:

[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 排序算法之类的算法。

【问题讨论】:

  • 这里en.wikipedia.org/wiki/… 列出了许多排序算法以及复杂性。
  • “用户”是人工输入吗?还是程序的另一部分?
  • 所有输入是否同时给出?还是您需要随时接受新的输入并进行排序?
  • @4386427 我既可以从文件中读取,也可以从人工输入中读取。我有一个函数可以读取输入并将其存储为程序运行。因此,如果输入是由人给出的,则在他想要的时候给出,如果用户也想要,我必须对矩阵进行排序。
  • 为什么不直接将元素放在矩阵中的正确位置?

标签: c matrix sparse-matrix


【解决方案1】:

您保存矩阵的格式称为三元组格式。按行或列顺序对它们进行排序意味着将它们保存为压缩稀疏列 (CSC) 或压缩稀疏行 (CSR) 格式。 大多数稀疏库有效地实现了它们。将 CSC 转换为 CSR 或反之亦然只是矩阵转置。如果您正在寻找一个小的高效代码,您可以查看 SuiteSparse/CSparse 中的“cs_transpose”函数。 将三元组转换为任何压缩形式就是这样。计算每行/列中元素的数量,然后按顺序将它们放在正确的位置(如桶排序)。该算法将是 O(n),但行/列中的元素未排序。 一个简单的解决方案是转置它们。转置两次实际上是在实践中使用的!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 2020-04-14
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多