Um das Array zu sortieren, verwenden Sie qsort()
und geben Sie eine Vergleichsfunktion.
Hier ist eine Funktion, die das richtige Ergebnis für alle möglichen Werte des price
-Members liefert:
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);
}
Notizen:
-
Die einfache Subtraktion von Werten liefert inkorrekte Ergebnisse, wenn der Unterschied nicht in den int
-Typ passt. Zum Beispiel können -2
und INT_MAX
nicht korrekt mit der Subtraktionsmethode verglichen werden. Dies würde auch nicht für Gleitkommazahlen funktionieren.
-
Die obige Methode kann für alle vergleichbaren Typen verwendet werden, einschließlich double
mit Ausnahme von NaN
.
Wenn Sie NaN
behandeln möchten, hier ist wie Sie sie am Ende gruppieren können:
#include
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);
}
}