Чтобы отсортировать массив, используйте qsort()
и передайте функцию сравнения.
Вот тот, который дает правильный результат для всех возможных значений price
члена:
typedef struct profile {
char gender[1];
double soc;
int price;
...
} PROFILE;
int compare_price(const void *a, const void *b) {
const PROFILE *oa = a;
const PROFILE *ob = b;
return (oa->price > ob->price) - (oa->price < ob->price);
}
int compare_soc(const void *a, const void *b) {
const PROFILE *oa = a;
const PROFILE *ob = b;
return (oa->soc > ob->soc) - (oa->soc < ob->soc);
}
Примечания:
простое вычитание значений дает неверные результаты, если разница не соответствует типу int
. Например, -2
и INT_MAX
нельзя правильно сравнить с методом вычитания. Это также не будет работать для значений с плавающей запятой.
вышеуказанный метод может использоваться для всех сопоставимых типов, включая double
, за исключением NaN
.
Если вы хотите обработать NaN
, вот как сгруппировать их в конце:
#include <math.h>
int compare_soc_nan_at_the_end(const void *a, const void *b) {
const PROFILE *oa = a;
const PROFILE *ob = b;
if (isnan(oa->soc)) {
return isnan(ob->soc) ? 0 : 1;
} else
if (isnan(ob->soc)) {
return -1;
} else {
return (oa->soc > ob->soc) - (oa->soc < ob->soc);
}
}