如何在C中使用qsort()对二维数组进行排序

时间:2019-01-01 00:38:12

标签: c arrays sorting qsort

我想使用qsort()根据第一列按降序对整数“ d”的二维数组进行排序。但是,我希望第一列的每个元素都与第二列中同一行开头的元素相匹配。

例如:

开头的数组:

列1:{4,5,1,3,0}
列2:{1,2,3,4,5}

,结果应为:

列1:{5,4,3,1,0}
列2:{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 :(得分:2)

C不允许分配数组。您可以创建一个指针数组,根据数组之一对指针排序,使用memcpy或循环移动行根据指针对数组重新排序(下面的链接显示了执行此操作的有效方法)。 (使用索引数组将要求compare函数仅在给定索引的情况下才能引用数组的元素。)

该线程答案的第二部分显示了指针方法。对于qsort(),比较函数的输入参数将是指向(a的第一个整数)行的指针。

Sorting two arrays based on one with standard library (copy steps avoided)

一种替代方法是使用结构,其中每个结构都包含一个数组,因为C确实允许分配结构。