Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中对二维双精度数组进行排序_C_Arrays_Sorting_Multidimensional Array_Quicksort - Fatal编程技术网

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

在C语言中对二维双精度数组进行排序,c,arrays,sorting,multidimensional-array,quicksort,C,Arrays,Sorting,Multidimensional Array,Quicksort,我试图用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* on

我试图用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;
} 
int comparararray(常量无效*arr1,常量无效*arr2){
常数双*1=(常数双*)arr1;
常数double*two=(常数double*)arr2;
printf(“一[0]=%lf,一[1]=%lf\n”,一[0],一[1]);
printf(“两[0]=%lf,两[1]=%lf\n,两[0],两[1]);
if(一[0]<二[0])返回-1;
如果(一[0]>二[0])返回1;
返回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;
}
输出

> ./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}}
>

你在用什么?如何调用
qsort
?用什么论据?请尝试创建一个数组并向我们展示。您是否意识到对2d数组进行排序并不简单?我的意思是,你需要非常清楚数组排序的含义。你需要展示更多的代码。对qsort的调用应该是qsort(指针指向第一行,行数,行大小,比较函数)。请注意,qsort将把指向行的指针传递给compare函数。您正在比较第一个值。如果要按第二个值排序:
返回两个[1]-一个[1]从表面上看,您要么希望对每个子数组的第一个(第零个)元素进行排序,要么将输入和输出返回到前面。调用
qsort()
将很重要,但我怀疑您正在(或应该)获得
double(*)[2]
值,但这不是您在比较器中编写的内容,因此排序不正确。确保可以打印所传递的两个数组中的每个数组中的数据。如果您只得到“零”(是使用
%f
%e
%g
格式打印的),那么您可能正在访问垃圾,不幸的是它没有崩溃。
> ./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}}
>