我有一个 double 数组。我计算数组的平均值。
我现在需要根据每个值与平均值的接近程度对数组进行排序。
如果我可以将一个特殊的比较器函数传递给 qsort 并将平均值作为第三个参数,那么它将解决我的问题:
int compareValues(double a, double b, double mean)
{
double aValue = fabs(mean - a);
double bValue = fabs(mean - b);
if (aValue > bValue)
return 1;
else if (aValue < bValue)
return -1;
else return 0;
}
但是,从我读到的所有内容来看,您不能将这样的比较器传递给 qsort。
有没有一种我没有看到的简单方法可以做到这一点?
最佳答案
构建您自己的专用快速排序函数:
int comp(double a, double b, double mean)
{
a = fabs(mean - a);
b = fabs(mean - b);
if (a > b)
return 1;
else if (a < b)
return -1;
else return 0;
}
void swap(double *v, int a, int b)
{
double temp;
temp = v[a];
v[a] = v[b];
v[b] = temp;
}
void sort(double *v, int left, int right, double mean, int (*comp)(double, double, double))
{
int i, last;
if (left >= right) return;
swap(v, left, (left + right) / 2);
last = left;
for (i = left + 1; i <= right; i++) {
if (comp(v[i], v[left], mean) < 0)
swap(v, ++last, i);
}
swap(v, left, last);
sort(v, left, last - 1, mean, comp);
sort(v, last + 1, right, mean, comp);
}
关于c - 根据均值的接近度对数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22274067/