现在,我已经看到了各种例子,但是我不明白它们的含义。
这是我的结构。
typedef struct profile{
char gender[1];
double soc;
. . .
} PROFILE;
我将要按照社会保障号码(soc)排序。
我知道需要一个比较函数,但我不知道如何得出我所需要的确切函数。
qsort
对结构体数组进行排序的示例。#include <stdio.h>
#include <stdlib.h>
typedef struct {
int price;
int id;
} order;
int compare(const void *a, const void *b) {
order *orderA = (order *)a;
order *orderB = (order *)b;
return (orderB->price - orderA->price);
}
int main() {
order list[6];
srand(time(NULL));
printf("Before sorting\n");
for (int i = 0; i < 6; i++) {
list[i].price = rand() % 10;
list[i].id = i;
printf("Order id = %d Price = %d\n", list[i].id, list[i].price);
}
qsort(list, 6, sizeof(order), compare);
printf("AFTER sorting\n");
for (int n = 0; n < 6; n++) {
printf("Order id = %d Price = %d\n", list[n].id, list[n].price);
}
return 0;
}
compare()
方法。 :) - gsamarasreturn(orderA->price - orderB->price)
。 - volkan g(orderA->price > orderB->price) - (orderA->price < orderB->price)
。请参见https://en.cppreference.com/w/c/algorithm/qsort以获取示例。 - qwr你的 Soc
应该几乎肯定不是double
类型,但无论如何,以下是比较函数需要返回的示例:
int compare(const void *p1, const void *p2)
{
const struct profile *elem1 = p1;
const struct profile *elem2 = p2;
if (elem1->soc < elem2->soc)
return -1;
else if (elem1->soc > elem2->soc)
return 1;
else
return 0;
}
感谢指出const void *.
这里有一个完整的示例(已存档):使用C qsort()函数对结构进行排序
qsort
,参数应该是 const
,并且可以更简单地编写为 return (int)(elem1->soc - elem2->soc);
。 - Chris Lutzint compare(const void *v1, const void *v2)
{
const struct profile *p1 = v1;
const struct profile *p2 = v2;
if (p1->gender > p2->gender)
return(+1);
else if (p1->gender < p2->gender)
return(-1);
else if (p1->soc > p2->soc)
return(+1);
else if (p1->soc < p2->soc)
return(-1);
else
return(0);
}
这首先比较性别字段,然后是社会保障字段。这就是如何处理任何多部分比较的方法。
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
不能使用减法方法正确比较。浮点数也无法使用这种方法。
上述方法适用于所有可比较的类型,包括除 NaN
之外的 double
。
如果您想处理 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);
}
}
double
可能不是最理想的选择,但对于存储9位数值来说完全足够。至少你不会遇到舍入小数表示的问题。 - Mark Ransom