herochenling 2015-08-25 01:34 采纳率: 33.3%
浏览 5055
已采纳

在c中怎样用qsort对结构体数组进行多级排序?

比如说 我有个结构体数组里面的每个元素是 struct a{ int cat; string train; double plane; float tree;};
然后首先按cat从小到大排,然后train从大到小,接着plane大到小,最后tree 小到大.我已经写了个comparator了,但是输出结果跟预期不一样. 然后我的问题是我这样写多级排序的comparator对吗?不对的话该怎么写? 还有folat double这种类型的camparator怎么写?如果像我那样直接相减,是不是会发生溢出之类的情况?图片说明

  • 写回答

2条回答 默认 最新

  • qq1223386926 2015-08-26 14:44
    关注
    #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;
    }
    ![图片说明](https://img-ask.csdn.net/upload/201508/26/1440600253_53796.png)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP