【问题标题】:How to sort two-dimensional array using qsort() in C如何在 C 中使用 qsort() 对二维数组进行排序
【发布时间】:2019-01-01 00:38:11
【问题描述】:

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

例如:

数组开头:

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

提前感谢您的帮助。

【问题讨论】:

  • 如果始终将两列视为一对,则一种选择是使其成为包含两个字段的struct 的一维数组。
  • 另外,当您将内容视为int 时,为什么您的数组包含float?或者,为什么其他所有内容(包括格式字符串)都将它们视为int?特别是当abcint 时,a - a * (b/3000) - c * a /40 不太可能给出您期望的结果。
  • 另外,你的范围比较是不可能的:while (a &lt; 1 &amp;&amp; a &gt; 1000000000) 继续只要a 小于 1 同时 大于 1000000000... 对不起,但我想说的是,在qsort 变得相关之前,您需要修复很多其他问题。
  • 将元素的大小设为一行的大小。效率不高,但有效。或者,分配一个索引数组,根据第一列的内容对它们进行排序。然后分配另一个原始数组大小的缓冲区,并将每一行复制到正确的位置。
  • @Arkku 数组被错误地声明为浮点数,因为我之前尝试过其他方法。您对while 也是正确的,我混淆了数据检查条件。谢谢你的建议。

标签: c arrays sorting qsort


【解决方案1】:

C 不允许分配数组。您可以创建一个指针数组,根据其中一个数组对指针进行排序,使用 memcpy 或循环根据指针重新排序数组以移动行(下面的链接显示了一种有效的方法)。 (使用索引数组需要比较函数能够仅在给定索引的情况下引用数组的元素。)

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

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

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

【讨论】: