C 为什么qsort不';在对一组结构进行排序时,不工作
我有一个这样的结构数组C 为什么qsort不';在对一组结构进行排序时,不工作,c,struct,union,qsort,C,Struct,Union,Qsort,我有一个这样的结构数组 typedef union value_ { double d; int i; } value; typedef struct number_ { char type; value val; }number; 类型可以是'i'或'd',具体取决于union字段中存储的是整数值还是双数值。 该数组如下所示: Integer value: -3 Double value: 4.84 Integer value
typedef union value_
{
double d;
int i;
} value;
typedef struct number_
{
char type;
value val;
}number;
类型可以是'i'
或'd'
,具体取决于union字段中存储的是整数值还是双数值。
该数组如下所示:
Integer value: -3
Double value: 4.84
Integer value: -4
Double value: 1.65
Integer value: 1
Double value: 2.54
Integer value: 2
Double value: -0.09
Integer value: -1
Integer value: -5
Double value: 0.20
Integer value: 2
Double value: -0.04
Double value: -2.69
Integer value: 4
Integer value: 5
Double value: 2.04
Integer value: 3
最重要的是,整数和double是一个接一个的。我需要以下一种方式使用qsort对这个数组进行排序:整数应该从低到高排序,反之亦然。
我使用以下函数进行比较:
int compare(const void *A, const void *B){
number *a = (number*)A;
number *b = (number*)B;
if (a->type == b->type) {
if (a->type =='i') {
return a->val.i - b->val.i;
} else {
if (a->val.d > b->val.d) return -1;
if (a->val.d < b->val.d) return 1;
else return 0;
}
} else {
return 0;
}
}
如果在这种情况下它应该返回0,为什么它会用整数来更改double?如果您需要保留原始列表的
int
和double
类型的“联锁模式”,同时对每组int
和double
值进行排序,那么您就不能使用完整列表中的标准qsort
功能
但是,您可以做的是将int
和double
条目分离到新列表中,分别对它们进行排序,然后将两个排序的列表合并回原始列表中,根据原始列表中条目的类型,从相关排序列表中提取int
或double
条目
下面是一个可能的实现(在代码中使用compare
函数,但不作任何更改–如果您为分隔的列表使用两个特定于类型的比较函数,则对于大型列表,您会获得更好的性能):
void打印列表(编号*列表,大小)
{
对于(尺寸i=0;i
如果您需要保留原始列表的int
和double
类型的“联锁模式”,但对每组int
和double
值进行排序,那么您就不能使用完整列表中的标准qsort
功能
但是,您可以做的是将int
和double
条目分离到新列表中,分别对它们进行排序,然后将两个排序的列表合并回原始列表中,根据原始列表中条目的类型,从相关排序列表中提取int
或double
条目
下面是一个可能的实现(在代码中使用compare
函数,但不作任何更改–如果您为分隔的列表使用两个特定于类型的比较函数,则对于大型列表,您会获得更好的性能):
void打印列表(编号*列表,大小)
{
对于(尺寸i=0;i
由于您的compare
函数返回两种不同类型的equal
,因此最终结果将是不可预测的。您可以更改它,使所有整数都小于所有双精度值,反之亦然。谢谢,我怀疑,这样的比较是一个糟糕的想法。我不认为您可以使用标准的qsort
函数来做您想做的事情。如果您的compare
函数针对不同类型返回0
,那么正如@500 InternalServerError指出的那样,您有不可预测/未定义的行为;然而,如果