45.使用qsort对结构体数组进行排序,实现对结构的体一级排序和二级排序,进一步了解qsort的原理...

qsort对结构体数组进行排序时,可以根据结构体元素中的任意某个成员进行比较之后,如果要交换则会连带结构体中其他成员的一起进行整体的结构体元素交换
所以感觉真是万能排序接口



只进行对结构体的一级排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct _stu
{
    char name[10];
    float score;
}Stu;


int callBackCompare(const void * pa, const void * pb)//一级升序
{
#if 0//正确
    if(strcmp((*(Stu*)pa).name,(*(Stu*)pb).name)>0)
        return 1;
    else
        return 0;//或return -1;都行,毕竟qsort只对正数感兴趣
#endif

#if 1  //正确
    if(strcmp(((Stu*)pa)->name,((Stu*)pb)->name) > 0 )
        return 1;
    else
        return 0;//或return -1;都行,毕竟qsort只对正数感兴趣

#endif
}

int main(void)
{
    Stu stu[] = {{"aaa",23.5},
                 {"xxx",45.6},
                 {"bbb",89},
                 {"xxx",23.4},
                 {"yyy",100}};

    qsort(stu,sizeof(stu)/sizeof(*stu),sizeof(Stu),callBackCompare);

    int i;
    for(i = 0;i<5;i++)
    {
        printf("%s,%f\n",stu[i].name,stu[i].score);

    }

    return 0;
}




对结构体一级排序的同时进行二级排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct _stu
{
    char name[10];
    float score;
}Stu;


int callBackCompare(const void * pa, const void * pb)//一级升序二级降序
{
#if 0//正确
    if(strcmp((*(Stu*)pa).name,(*(Stu*)pb).name)>0)//对1级进行升序
        return 1;
    else
    {
        if( (*(Stu*)pa).score < (*(Stu*)pb).score )//对2级进行降序
        {
            return 1;
        }
        else
            return 0;
    }
#endif

#if 0  //正确
    if(strcmp(((Stu*)pa)->name,((Stu*)pb)->name) > 0 )
        return 1;
    else
    {
        if( ((Stu*)pa)->score < ((Stu*)pb)->score )//对2级进行降序
        {
            return 1;
        }
        else
            return 0;
    }

#endif
}

int main(void)
{
    Stu stu[] = {{"aaa",23.5},
                 {"xxx",45.6},
                 {"bbb",89},
                 {"xxx",23.4},
                 {"yyy",100}};

    qsort(stu,sizeof(stu)/sizeof(*stu),sizeof(Stu),callBackCompare);

    int i;
    for(i = 0;i<5;i++)
    {
        printf("%s,%f\n",stu[i].name,stu[i].score);

    }

    return 0;
}

 

转载于:https://www.cnblogs.com/ZhuLuoJiGongYuan/p/9516950.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值