0

我尝试使用 qsort 对双值数组进行排序,但它似乎不起作用。想知道这里出了什么问题吗?

#include <stdio.h>
#include <stdlib.h>
static double compare (const void * a, const void * b)
{
  if (*(double*)a > *(double*)b) return 1;
  else if (*(double*)a < *(double*)b) return -1;
  else return 0;  
}

int main() {

    int idx;
    double* sum_least_square_err;

    sum_least_square_err = (double*) malloc (2500*2500*sizeof(double));

    sum_least_square_err[0] = 0.642;    
    sum_least_square_err[1] = 0.236;
    sum_least_square_err[2] = 0.946;
    idx = 3;

    qsort(sum_least_square_err, idx, sizeof(sum_least_square_err), compare);

    int i;
    for (i=0; i<idx; i++){
       fprintf(stderr,"sum_least_square_err[%d] = %.3f\n", i, sum_least_square_err[i]);            
    }
    fprintf(stderr,"MAEE = %.3f\n", sum_least_square_err[idx/2]);

    free(sum_least_square_err);
}

结果:

sum_least_square_err[0] = 0.642

sum_least_square_err[1] = 0.236

sum_least_square_err[2] = 0.946

MAEE = 0.236

4

2 回答 2

9

改变:

static double compare (const void * a, const void * b)

至:

static int compare (const void * a, const void * b)

并改变:

qsort(sum_least_square_err, idx, sizeof(sum_least_square_err), compare);

至:

qsort(sum_least_square_err, idx, sizeof(sum_least_square_err[0]), compare);

注意:您应该收到关于第一个错误的适当编译器警告 - 您是否正在编译gcc -Wall或等效,如果是,您是否注意到编译器警告?(如果没有,请接受提示,让编译器将来为您捕获此类问题。)

于 2012-08-13T09:34:22.933 回答
3

我相信你的错误在于:

qsort(sum_least_square_err, idx, sizeof(sum_least_square_err), compare);

问题是第三个参数应该是sizeof(double),即数组元素的大小。相反,您传递的是指针的大小,它可以(并且通常是)与元素的大小不同。

有关详细信息,请参阅:http ://www.cplusplus.com/reference/clibrary/cstdlib/qsort/

编辑:Paul R的回答是正确的:你的比较函数的原型是错误的。原型应该是:

int ( * comparator ) ( const void *, const void * )

最后但并非最不重要的一点是,在您的代码中:

if (*(double*)a > *(double*)b) return 1;
else if (*(double*)a < *(double*)b) return -1;

你正在抛弃const. 这在这里没有后果,但仍然是不好的形式。

于 2012-08-13T09:37:02.190 回答