比如说 我有个结构体数组里面的每个元素是 struct a{ int cat; string train; double plane; float tree;};
然后首先按cat从小到大排,然后train从大到小,接着plane大到小,最后tree 小到大.我已经写了个comparator了,但是输出结果跟预期不一样. 然后我的问题是我这样写多级排序的comparator对吗?不对的话该怎么写? 还有folat double这种类型的camparator怎么写?如果像我那样直接相减,是不是会发生溢出之类的情况?
#include <stdlib.h>
#include <string.h>
struct st_test
{
int cat;
char caTrain[ 100 ];
double plane;
float tree;
};
int cmp( const void *arg1, const void *arg2 );
int
main( void )
{
int i = 0;
struct st_test stArr[] = {
{ 2, "defghi", 5.2, 6.7 },
{ 2, "aefghi", 5.0, 6.9 },
{ 1, "aefghi", 5.1, 6.0 },
{ 1, "aefghi", 5.9, 5.0 },
{ 3, "elflfg", 9.0, 2.0 },
{ 3, "elflfg", 9.0, 1.0 }
};
qsort( stArr, 6, sizeof( struct st_test ), cmp );
for( i = 0; i < 6; i++ )
{
printf( "%2d %8s %3.1lf %3.1f\n", stArr[ i ].cat, stArr[ i ].caTrain,
stArr[ i ].plane, stArr[ i ].tree );
}
return 0;
}
int
cmp( const void *arg1, const void *arg2 )
{
static const double DSTDZERO = 0.0000001;
static const float FSTDZERO = 0.0000001;
struct st_test *stArg1 = ( struct st_test * )arg1;
struct st_test *stArg2 = ( struct st_test * )arg2;
if( stArg1->cat != stArg2->cat )
return stArg1->cat > stArg2->cat ? 1 : -1;
else if( strcmp( stArg1->caTrain, stArg2->caTrain ) != 0 )
return -strcmp( stArg1->caTrain, stArg2->caTrain );
else if( !( ( stArg1->plane - stArg2->plane >= -DSTDZERO ) && ( stArg1->plane - stArg2->plane <= DSTDZERO ) ) )
{
if( stArg1->plane - stArg2->plane < -DSTDZERO )
return 1;
if( stArg1->plane - stArg2->plane > DSTDZERO )
return -1;
}
else if( !( ( stArg1->tree - stArg2->tree >= -FSTDZERO ) && ( stArg1->tree - stArg2->tree <= FSTDZERO ) ) )
{
if( stArg1->tree - stArg2->tree < -FSTDZERO )
return -1;
if( stArg1->tree - stArg2->tree > FSTDZERO )
return 1;
}
return 0;
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。