【问题标题】:Rearranging rows in dynamically allocated 2D array in C在C中重新排列动态分配的二维数组中的行
【发布时间】:2020-04-10 08:55:00
【问题描述】:

我目前正在使用 C 语言编写一个程序,在该程序中我输入矩阵维数和矩阵元素,这些矩阵在内存中表示为动态二维数组。程序稍后找到每行的最大值。然后它在所有行的最大值中找到最小的最大值。

例如, 如果我们有 3x3 矩阵:
1 2 3
7 8 9
4 5 6

最大值为 3、9、6,最小最大值为 3。如果最小最大值为正,程序应继续重新排列行的顺序,使其遵循最大值的升序,因此最终输出应为:

1 2 3
4 5 6
7 8 9

我创建了一个动态数组,其中包含最大值的值,然后是找到它们的行,例如:3 0 6 1 9 2。但我不知道下一步该怎么做。如果我以某种方式找到一种方法来使用这个数组和我制作的索引,我就会想到如果我在不同的行中具有相同的最大值,我就会遇到问题,例如,如果矩阵是:

1 2 3
4 5 6
7 8 9
1 1 6

我的数组将是 3 0 6 1 9 2 6 3。然后我需要额外的数组来存储位置,这就像一个开始。也许我可以使用一些标志来查看我是否已经遇到过相同的数字,但我通常像算法一样,不知道该怎么做。我想到了创建一个数组并将值传递给它,但它会浪费额外的空间......如果我找到一种方法来找到我想打印行的顺序,我需要一个不同于我的地址函数吗?已经有? (也就是说,在双 for 循环中,对于当前元素 - *(matrix+i * numOfCols+currentCol) )如果有人告诉我我是否正确地考虑了问题解决方案并就这个问题给我一些建议,我将不胜感激。提前致谢!

【问题讨论】:

    标签: c matrix dynamic-arrays


    【解决方案1】:

    我不知道我是否理解正确,但是您要做的是重新排列矩阵,将行从最大到最小排列... 首先,我认为您不需要动态数组,因为最大值已经排序,并且它们在数组上的位置足以描述它们所在的行。 为了从最大值到最小值,我会创建一个循环来保存最大值的位置,然后使用它将输入矩阵中的对应行存储到输出矩阵中。然后,将该最大值更改为 0(如果您在正数中包含 0,则更改为 -1),并重复该过程,直到所有行都已传递到输出矩阵。这是它的外观草图:

    for(k = 0; k < n_rows; ++k)
         for(i = 0; i < n_rows; ++i)
              if (max[i] > current_max)
                   current_max = max[i];
                   max_row = i;
         for(c = 0; c < n_columns; ++c)
              output_matrix[row][c] = inputmatrix[max_row][c];
         max[max_row] = 0;
    

    【讨论】:

    • 最后我的做法有所不同,但我认为您的代码可能更高效,并且还帮助我找到了自己的解决方案,非常感谢您,非常感谢您的努力关于提供这个答案。
    • 不客气。我很高兴听到您找到了自己的解决方案,因为这意味着您已经理解了答案。很高兴听到感谢,因为这并不常见。如果此答案对您有用,请随时接受或投票。
    【解决方案2】:

    数组不是动态的,因为我们不能改变数组的大小,所以在这种情况下你可以使用双指针,例如int **matrix来存储二维数组的值。

    搜索每行最大值和每个最大值的行索引的函数:

    int * max_of_row(int n, int m, int **mat) {
        // allocate for n row and the row index of max value
        int *matrix = malloc (sizeof(int) * n*2);
    
        for(int i = 0; i < 2*n; i++) {
            matrix[i] = 0;
        }
    
        int k = 0;
    
        for(int i = 0; i < n; i++) {    
            for (int j = 0; j < m; j++) {
                if(matrix[k] < mat[i][j]) {
                    matrix[k] = mat[i][j];
                }
            }
            matrix[k+1] = i;
            k += 2;
        }
    
        return matrix;
    }
    

    测试的主要功能:

    int main(int argc, char const *argv[])
    {
        // allocate for 4 rows
        int **matrix  = malloc (sizeof (int) * 4);
        for (int i = 0; i < 4; i++) {
            // allocate for 3 cols
            matrix[i] = malloc(sizeof(int) * 3);
            for(int j = 0; j < 3; j++){
                matrix[i][j] = i+j;
            }
        }
    
    
        int * mat = max_of_row(4, 3,matrix);
    
        printf("matrix:\n");
        for (int i = 0; i < 4; i++) {
            for(int j = 0; j < 3; j++){
                printf("%d ",matrix[i][j]);
            }
            printf("\n");
        }
        printf("max of row and positon\n");
        for (int i = 0; i < 8; i++) {
            printf("%d ", mat[i]);
        }
        printf("\nmax of row\n");
        for (int i = 0; i < 8; i += 2) {
            printf("%d ", mat[i]);
        }
    
        printf("\n");
        return 0;
    }
    

    输出:

    matrix:
    0 1 2 
    1 2 3 
    2 3 4 
    3 4 5 
    max of row and positon
    2 0 3 1 4 2 5 3 
    max of row
    2 3 4 5
    

    【讨论】:

    • 谢谢,这对我有帮助,因为之前我尝试使用单指针分配矩阵,所以取消引用和访问元素的表达式是一团糟!
    • 不客气。如果对您有用,您可以投票或接受作为最佳答案
    猜你喜欢
    • 2012-02-06
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 2014-08-21
    • 2015-02-10
    • 2021-01-26
    相关资源
    最近更新 更多