用qsort对结构体数组进行多级排序

C语言笔记

用qsort对结构体数组进行多级排序

#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()
{
    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;
}

猜你喜欢

转载自www.cnblogs.com/dump16/p/12387411.html