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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在c中怎样用qsort对结构体数组进行多级排序相关的知识,希望对你有一定的参考价值。

参考技术A #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;

怎样用sort和qsort对二维数组排序

怎样用他们两个对二维数组的某一维排序,比如对二维数组a[100][2]的第一列排序,排好的结果放到一维数组b[100]里面去.(最好还能实现在第一列内有元素相同时,能够根据第二列的元素决定放在b[100]里的顺序)
我说错了,我要对二维数组a[100][2]的第一列排序,每行都随着第一列的元素一起移动

你换成结构体吧
struct In
int x; int y;
s[100];
//按照x从小到大排序,当x相等时按照y从小到大排序
int cmp( const void *a , const void *b )

struct In *c = (In *)a;
struct In *d = (In *)b;
if(c->y != d->y) return c->x - d->x;
else return c->y – d->y;

qsort(s,100,sizeof(s[0]),cmp);
参考技术A 先把要排的一列存到 b[100] 里,用 qsort 对 b 排队。
排好后,打印也好,赋回 a 也好,自己写吧。

#include <stdio.h>
#include <stdlib.h>

int compare (const void * a, const void * b)

return ( *(int*)a - *(int*)b );


void main()

int a[100][2];
int i,b[100];

for (i=0;i<100;i++) b[i] = a[i][0]; // 要排的数放入b.

qsort( &b[0], 100, sizeof( int ), compare ); // b 里100个数 排队

for (i=0;i<100;i++) printf("%d ",b[i]); // 打印结果

参考技术B 用qsort()排序时,关键是比较函数的编写,如果你的比较函数编写的合适,qsort()可以对二维数组排序。 参考技术C sort好像C里没有吧,C++里的吧!! 参考技术D 用指针

以上是关于在c中怎样用qsort对结构体数组进行多级排序的主要内容,如果未能解决你的问题,请参考以下文章

怎样用sort和qsort对二维数组排序

c++中参考C语言的qsort函数实现一个一个能对任意数据类型(包括结构体)的数组进行排序的函数

c语言 qsort 对结构体数组排序

C语言之qsort函数进行排序

Qsort 结构体数组

C语言,结构体快排