Изменение порядка строк в динамически размещаемом двумерном массиве в C - PullRequest
0 голосов
/ 10 апреля 2020

В настоящее время я работаю над программой на C, в которую я ввожу размеры матрицы и элементы матрицы, которая представлена ​​в памяти как динамический c 2D массив. Программа позже находит максимум каждой строки. Затем он находит минимальный максимум из максимумов всех строк.

Например, если у нас есть матрица 3x3:
1 2 3
7 8 9
4 5 6

максимальные значения 3, 9, 6 и минимальные максимальные значения 3. Если минимальный максимальный положительный, программа должна продолжить порядок расположения строк, чтобы они следовали в порядке возрастания максимальных значений, поэтому конечный результат должен быть:

1 2 3
4 5 6
7 8 9

Я создал массив Dynami c, который содержит значения максимумов, за которыми следует строка, в которой они были найдены, например: 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. Тогда мне понадобится дополнительный массив для позиций, и он станет похож на момента создания. Может быть, я мог бы использовать какой-нибудь флаг, чтобы увидеть, сталкивался ли я уже с тем же номером, но обычно я, как алгоритмически, не знаю, что делать. Мне пришло в голову создать массив и передать ему значения, но это потратило бы дополнительное пространство ... Если бы я нашел способ найти порядок, в котором я хотел бы печатать строки, понадобилась бы мне функция адресации, отличная от той, которую я уже есть? (то есть в двойном для l oop, для текущего элемента - * (matrix + i * numOfCols + currentCol)) Я был бы признателен, если бы кто-нибудь сказал мне, правильно ли я думаю о решении проблемы, и дал бы мне несколько советов по этой проблеме. Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Массив не является динамическим c, поскольку мы не можем изменить размер массива, поэтому в этом случае вы можете использовать двойной указатель, например, int **matrix для хранения значения 2D-массива.

Функция поиска максимального значения каждой строки и индекса строки каждого максимального значения:

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
1 голос
/ 10 апреля 2020

Я не знаю, правильно ли я понял, но вы хотите переставить матрицу, упорядочив строки по наибольшему максимуму до минимума ... Во-первых, я не думаю, что вам нужно Dynami c массив, потому что максимумы уже упорядочены, и их положение в массиве достаточно, чтобы описать строку, в которой они находятся. Чтобы упорядочить от максимума до минимума, я бы сделал al oop, который сохранил позицию максимума, а затем использовал его для сохранения соответствующей строки в матрице ввода в матрице вывода. Затем измените значение этого максимума на 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;
...