【发布时间】:2013-10-08 04:10:40
【问题描述】:
我的英文很差,如有错误请见谅。谢谢!
当我使用 qsort 对该结构进行排序时遇到了这个问题:
typedef struct
{
double cost,earn;
}ac;
我想这样排序:
int cmp(const void *a,const void *b)
{
ac this_a=*(ac*)a;
ac this_b=*(ac*)b;
return (this_b.earn/this_b.cost-this_a.earn/this_a.cost)>0.0;
}
但它没有用。当我改成这个时,它起作用了:
int cmp(const void *a,const void *b)
{
ac this_a=*(ac*)a;
ac this_b=*(ac*)b;
return (this_a.cost*this_b.earn-this_a.earn*this_b.cost);
}
为什么会这样?这两个功能有什么不同吗?或者可能代码的另一部分是错误的?
【问题讨论】:
-
删除第一个示例中的
>0.0,它会运行得很好 -
@Lưu Vĩnh Phúc:两者之间的区别不仅限于
> 0.0。在第二种情况下对公式所做的更改显然是为了避免“被零除”问题。显然,这也是一个问题。因此,在第一种情况下删除>0.0显然是不够的。 -
@AndreyT:是的,你是对的,第二个不仅能解决问题,还能提高性能
-
@Lưu Vĩnh Phúc:性能可能会更好,但第二个仍然坏:它存在溢出问题。
-
谢谢大家。实际上,输入的数量很小,因此不会出现溢出问题。