簡體   English   中英

在 C 中重新排列動態分配的二維數組中的行

[英]Rearranging rows in dynamically allocated 2D array in C

我目前正在 C 中開發一個程序,在該程序中我輸入矩陣維度和矩陣元素,在 memory 中表示為動態二維數組。 程序稍后找到每行的最大值。 然后它在所有行的最大值中找到最小的最大值。

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

最大值為 3、9、6,最小最大值為 3。如果最小最大值為正,程序應繼續重新排列行的順序,使其遵循最大值的升序,因此最終的 output 應為:

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。然后我需要額外的數組來存儲位置,這就像一個開始。 也許我可以使用一些標志來查看我是否已經遇到過相同的數字,但我通常像算法一樣,不知道該怎么做。 我想到了創建一個數組並將值傳輸給它,但它會浪費額外的空間......如果我找到一種方法來找到我想打印行的順序,我是否需要一個不同於我的地址 function已經有? (也就是說,在雙循環中,對於當前元素 - *(matrix+i * numOfCols+currentCol) )如果有人告訴我我是否正確地考慮了問題解決方案並就這個問題給我一些建議,我將不勝感激。 提前致謝!

我不知道我是否理解正確,但是您要做的是重新排列矩陣,將行從最大到最小排列...首先,我認為您不需要動態數組,因為最大值已經排序,並且它們在數組上的 position 足以描述它們所在的行。 為了從最大值到最小值,我將創建一個循環來保存最大值的 position,然后使用它將輸入矩陣中的對應行存儲到 output 矩陣中。 然后,將該最大值更改為 0(如果您在正數中包含 0,則更改為 -1),並重復該過程,直到所有行都已傳遞到 output 矩陣。 這是它的外觀草圖:

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來存儲二維數組的值。

function 用於搜索每行的最大值和每個最大值的行索引:

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;
}

主要用於測試的function:

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;
}

Output:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM