2

我是使用 qsort 的新手,我正在尝试对预定义的双精度数组进行 qsort,不幸的是,在使用 qsort 对数组进行排序后,我收到的结果全为 0。我完全迷失了,任何建议将不胜感激。这是我用来对这个双精度数组进行排序的代码。

static int compare (const void * a, const void * b){
    if (*(const double*)a > *(const double*)b) return 1;
    else if (*(const double*)a < *(const double*)b) return -1;
    else return 0;  
}

double stuff[] = {255, 1, 5, 39.0};
qsort(stuff, 4, sizeof(double), compare);
int i;
for(i = 0; i < 4; i++){
    printf("%d %s", stuff[i], " ");
}
4

2 回答 2

2

您的问题是您使用printf()函数打印结果的方式。要打印double值,您需要使用%f,如下所示:

printf("%f ", stuff[i]);

另外,只是一个旁注:您不需要else在比较函数中使用这些语句,因为一旦条件被评估为真,它将返回该函数。

于 2013-09-20T01:45:47.900 回答
1

如前所述,问题在于您使用的格式说明符printf(): %d(您使用的)不适用于doubles; 你应该使用类似%for的东西%g。有关更多详细信息,请参阅StackOverflow 上的此问答。

就像是:

printf("%g ", stuff[i]);

应该没问题。

(请注意,您不需要将"%s"单空格字符串文字传递给printf()任何一个。)

此外,我想向您展示如何更好地编写您的compare()函数:

  1. 您可以在函数体的开头将原始void*指针分配给某个常量值,以避免重复(丑陋的)强制转换,并使代码更清晰易读。

  2. 您可能想简化if...else if...else结构,只使用更简单的if...return结构。

像这样的东西:

static int compare(const void * a, const void * b) 
{
    const double lhs = *(const double *)a;
    const double rhs = *(const double *)b;

    if (lhs > rhs)
        return 1;

    if (lhs < rhs)
        return -1;

    return 0;
}
于 2013-09-20T10:44:59.010 回答