用C语言对二维双精度数组进行排序



我正在尝试用qsort在c中排序一个二维数组

我有这样一个数组:

{ {1.0, 0.0}, {123.0, 1.0}, {2.0, 2.0} }

,我希望它按照第二个值排序,像这样:

{ {1.0, 0.0}, {2.0, 2.0}, {123.0, 1.0} }

我试图为qsort编写一个数组比较器,但我总是得到错误的元素顺序。

这是我写的比较器:

int CompareArrays(const void* arr1, const void* arr2) {
 const double* one = (const double*) arr1;
 const double* two = (const double*) arr2;
 printf ("one[0] = %lf , one[1] = %lf n", one[0], one[1]);
 printf ("two[0] = %lf , two[1] = %lf n", two[0], two[1]);
 if (one[0] < two[0]) return -1;
 if (one[0] > two[0]) return 1;
 return 0;
} 

我还试图打印值,以便了解每次比较哪些项目,但它一直打印0.0000…每次.

有人知道我做错了什么吗?

问题的人都试图帮助你是,你的文本说一件事(按第二个元素排序),但你的例子显示另一个(按第一个元素排序)。让我们首先假设"按第一个元素排序"并解决问题:

#include <stdio.h>
#include <stdlib.h>
int compareArrays(const void *array1, const void *array2) {
    const double *one = (const double *) array1;
    const double *two = (const double *) array2;
    return (one[0] > two[0]) - (one[0] < two[0]); // compare idiom
}
#define SUBELEMENTS (2)
void printArray(double array[][SUBELEMENTS], size_t rows) {
    printf("{");
    for (size_t i = 0; i < rows; i++) {
        printf("{");
        for (size_t j = 0; j < SUBELEMENTS; j++) {
            printf("%.1f", array[i][j]);
            if (SUBELEMENTS > 1 && j < SUBELEMENTS - 1) {
                printf(", ");
            }
        }
        printf("}");
        if (rows > 1 && i < rows - 1) {
            printf(", ");
        }
    }
    printf("}n");
}
int main() {
    double array[][SUBELEMENTS] = {{1.0, 0.0}, {123.0, 1.0}, {2.0, 2.0}};
    size_t elements = sizeof(array) / sizeof(array[0]);
    printf("Unsorted: ");
    printArray(array, elements);
    qsort(array, elements, sizeof array[0], &compareArrays);
    printf("Sorted:   ");
    printArray(array, elements);
    return 0;
}

如果你真的想要"按第二个元素排序",那么把compareArrays()的最后一行改为:

return (one[1] > two[1]) - (one[1] < two[1]);

> ./a.out
Unsorted: {{1.0, 0.0}, {123.0, 1.0}, {2.0, 2.0}}
Sorted:   {{1.0, 0.0}, {2.0, 2.0}, {123.0, 1.0}}
>

最新更新