我更喜欢“构建自己的qsort”答案。但是你可以做这样的事情。
我不是对双精度列表和外部均值进行排序,而是对结构列表进行排序,每个结构存储指向双精度和(相同)均值的指针。
我对 that 数组进行排序,然后列出结果的值。
似乎有效,但最终比@AlterMann 所做的要糟糕得多。
gcc -o cmp cmp.c -std=c99 -Lmath
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
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;
}
typedef struct dbl_and_mean_t{
const double* value;
const double* mean;
} dbl_and_mean;
int cmpToMean(const void* a, const void* b){
dbl_and_mean* dma = (dbl_and_mean*)a;
dbl_and_mean* dmb = (dbl_and_mean*)b;
double aValue = *(dma->value);
double bValue = *(dmb->value);
// we assume mean is same in both cases.
double mean = *(dma->mean);
return compareValues( aValue, bValue, mean );
}
/*
void qsort(void *base, size_t nmemb, size_t size,
int(*compar)(const void *, const void *));
*/
int main(int argc, char* argv[]) {
unsigned int numlen = 100;
double numbers[100] = {
20.11267454572858, 27.00916748845121, 41.69273886807976, 59.574594859929206, 5.148795948275042, 25.0952600949092, 7.490782458661016, 46.82558348995649, 99.1505635434539, 80.82884752229698, 34.562195425918965, 12.83419004171462, 65.21675903144343, 60.939055397544415, 59.716932510808405, 68.58214712201324, 16.96903326566488, 40.890117173893096, 43.24295370982686, 49.74083920053604, 51.879578222761545, 85.55201465227584, 0.9988146850440804, 72.9927624741183, 24.544352584593764, 38.07294449540915, 89.21601198806061, 46.242113823416055, 34.77013261276065, 75.50489987606491, 68.73075063359678, 34.11250399830412, 33.03497314824547, 50.356507540969574, 43.44185408674688, 1.3480391491077937, 17.87324689034111, 27.521463721587523, 65.36478555088043, 89.08983557487836, 91.20949281863321, 36.15883451406319, 64.71929705431249, 96.51660222081459, 84.3925334284804, 9.273474377948954, 20.7970994809055, 81.63173897647613, 34.54178336906219, 69.17908602857048, 34.49554788014096, 27.658713128591337, 37.84762296714004, 32.47882877578083, 80.33388365434217, 12.535403896961606, 1.6177858463917616, 58.492589297744544, 4.996882418234216, 0.6516899504362961, 94.14913555948795, 45.01455399721226, 91.13032884578304, 0.9747543756017163, 87.73797888418335, 17.05103955970504, 34.9990215191348, 32.132359722564175, 51.39141618413181, 90.41510433921886, 70.85275376557709, 60.81740079574899, 56.276844928014334, 96.84741168778665, 38.587969750110915, 26.93423429759396, 56.28727064877738, 40.69208717486249, 30.893466414304214, 54.69704130793473, 8.422991004598423, 42.51756379315109, 6.109299688810255, 97.5321480398511, 76.34912536352495, 83.6200551607522, 19.447640061947336, 29.659746702311896, 72.24996303415246, 7.992406225268933, 57.09202659164654, 60.782606246000036, 60.398430869817474, 41.77937462471086, 47.28376403551421, 54.31179044336384, 39.837395485680894, 39.301123086537395, 71.8438289228498, 49.209926974123285
};
double mean, sum = 0;
dbl_and_mean* doubles_and_mean = calloc( numlen, sizeof(dbl_and_mean) );
for( unsigned i = 0; i < numlen; i++){
sum = sum + numbers[i];
doubles_and_mean[i].value = &(numbers[i]);
doubles_and_mean[i].mean = &mean;
}
mean = sum / numlen;
printf("Mean is %f\n", mean);
qsort( doubles_and_mean , 100, sizeof(dbl_and_mean), &cmpToMean);
for( unsigned int i=0; i< numlen; i++){
printf("%03d: %f\n", i, *(doubles_and_mean[i].value) );
}
}