Как отсортировать двумерный массив с помощью qsort () в C - PullRequest
0 голосов
/ 01 января 2019

Я хочу отсортировать двумерный массив целых чисел "d" по первому столбцу в порядке убывания, используя qsort ().Однако я хочу, чтобы каждый элемент первого столбца соответствовал элементу, который был во втором столбце в той же строке в начале.

Например:

Массив в начале:

column1: {4, 5, 1, 3, 0}
column2: {1, 2, 3, 4, 5}

, и результат должен быть:

column1: {5, 4, 3, 1, 0}
column2: {2, 1, 4, 3, 5}

Я написал код для сортировки одномерного массива, ноЯ не могу понять, как это сделать для двумерного.

int main(){

    FILE *file_in, *file_out;

    file_in=fopen("file.in", "r");
        fscanf(file_in, "%d", &N);

    for( i = 1; i <= N; i = i + 1 ){
            fscanf(file_in, "%d", &a);

            fscanf(file_in, "%d", &b);

            fscanf(file_in, "%d", &c);

            d[i][1] = a+b+c;
            d[i][2] = a*b*c
    }
    fclose(file_in);

    int cmpfunc (const void * a, const void * b) {
        return ( *(int*)b - *(int*)a );
    }
    qsort(d, N, sizeof(int), cmpfunc);

    file_out=fopen("file.out","w");
    fprintf(file_out, "%d", M);
    for ( i=1; i<=N; i = i + 1){
        fprintf(file_out, "%d", d);
    }
    fclose(file_out);
    return 0;
}

Заранее благодарю за помощь.

1 Ответ

0 голосов
/ 01 января 2019

C не позволяет присваивать массивы.Вы можете создать массив указателей, отсортировать указатели в соответствии с одним из массивов, переупорядочить массивы в соответствии с указателями, используя memcpy или цикл для перемещения строк (ссылка ниже показывает эффективный способ сделать это).(Использование массива индексов потребовало бы, чтобы функция сравнения могла ссылаться на элементы массива только с учетом индексов.)

Во второй части ответа в этой теме показан метод указателя.Для qsort () входными параметрами функции сравнения будет указатель на указатель на (первое целое число a) строки.

Сортировка двух массивов по одному со стандартной библиотекой (шаги копирования исключены)

Альтернативой может быть использование структур, где каждая структура содержит массив, поскольку C допускает присваивание структур.

...