我尝试使用qsort对double值数组进行排序,但它似乎不起作用。想知道这里出了什么问题?
#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
答案 0 :(得分:7)
变化:
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
编译还是等效的,如果是,您是否注意到编译器警告? (如果没有,请接受提示,让编译器在将来为您解决此类问题。)
答案 1 :(得分:3)
我相信你的错误就行了:
qsort(sum_least_square_err, idx, sizeof(sum_least_square_err), compare);
问题是第3个参数应该是sizeof(double)
,即数组元素的大小。你改为传递一个指针的大小,它可以(并且通常是)与元素的大小不同。
有关详细信息,请参阅:http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/
编辑:而Paul R正好在他的answer中:比较函数的原型是错误的。原型应该是:
int ( * comparator ) ( const void *, const void * )
最后但并非最不重要的,在您的代码中:
if (*(double*)a > *(double*)b) return 1;
else if (*(double*)a < *(double*)b) return -1;
你正在抛弃const
。这在这里没有影响,但仍然是不好的形式。