在 C 中重新排列动态分配的二维数组中的行

Rearranging rows in dynamically allocated 2D array in C

我目前正在开发一个 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。然后我需要额外的位置数组,它变得像一个开始。也许我可以使用一些标志来查看我是否已经遇到了相同的数字,但我通常,就像算法一样,不知道该怎么做。我想到制作一个数组并将值传递给它,但这会浪费额外的 space... 如果我找到一种方法来找到我想要打印行的顺序,我是否需要一个地址函数与我已有的不同? (即,在双 for 循环中,对于当前元素 - *(matrix+i * numOfCols+currentCol) )如果有人告诉我我对问题解决方案的思考是否正确并给我一些关于这个问题的建议,我将不胜感激。提前致谢!

不知道我理解的对不对,你要做的是重新排列矩阵,把行从最大到最小排列... 首先,我认为您不需要动态数组,因为最大值已经排序,并且它们在数组中的位置足以描述它们所在的行。 为了从最大到最小排序,我会做一个循环来保存最大值的位置,然后用它来将输入矩阵中对应的行存储到输出矩阵中。然后,将该最大值的值更改为 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;

数组不是动态的,因为我们不能改变数组的大小,所以在这种情况下可以使用双指针,例如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