QSorting一系列双打

时间:2013-09-20 01:38:08

标签: c double 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], " ");
}

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

如前所述,问题出在您与printf()一起使用的格式说明符中:%d(您使用过的)不适合double s;您应该使用%f%g之类的内容。有关详细信息,请参阅this Q&A on StackOverflow

类似的东西:

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

应该没问题。

(请注意,您无需将"%s"和单空格字符串文字传递给printf()。)

此外,我想告诉你如何更好地编写compare()函数:

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

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

  3. 这样的事情:

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