【C语言进阶】学会使用qsort函数
创始人
2024-04-27 10:10:08
0

写在前面

qsort函数是C语言的库函数,能实现对各种元素类型的比较,使用的基本思想是快速排序法,头文件是,本文不讲解具体实现原理,只对使用方法进行说明。


正文

铺垫知识

qsort函数
参数类型
void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*));
参数类型解释参数1 待排序数组首元素的地址
参数2 数组内元素个数
参数3 数组内每个元素大小,单位是字节
参数4 函数指针,由自己实现,内容是两个元素的比较方法
void*参数1和参数4中的void*无类型的指针,能够接受各种类型的参数,这样的话,我们就能传各种类型的参数
void*的注意事项

    由于void是无类型指针所以

1、void类型指针不能进行加减整数的操作(不知道步长)

2、不能进行解引用操作,

3、想要进行这些操作,需要把void类型强制类型转成所需要的类型才能操作,例如(int*)e1,就将void*类型的e1转换为int*


使用qsort函数进行整型数组的排序

在自己完成的in_cmp函数中,给出的是两个元素的比较方法

  • 正序排序时,e1>e2,返回大于0的数,e1==e2,返回0,e1小于0的数
  • 逆序排序时,e1>e2,返回小于0的数,e1==e2,返回0,e1大于0的数

当然,我们可以用强制类型转换后,就知道了步长,使用减法来比较e1和e2的大小

#include
#include 
int int_cmp(const void* e1,const void* e2)
{if(*(int*)e1 > *(int*)e2 )//先强制类型转换,在解引用进行比较return 1;else if(*(int*)e1 == *(int*)e2 )return 0;else return -1;
}
int main()
{int i=0;int arr[10]={1,4,0,5,8,9,2,3,6,7};int sz=sizeof(arr)/sizeof(arr[0]);qsort(arr,sz,sizeof(arr[0]),int_cmp);for(i=0;i

使用qsort函数进行浮点型数组的排序

#include
#include 
int float_cmp(const void* e1,const void* e2)
{return *(float*)e1 - *(float*)e2;
}
int main()
{int i=0;float arr[5]={1.0,3.5,2.2,7.3,5.5};int sz=sizeof(arr)/sizeof(arr[0]);qsort(arr,sz,sizeof(arr[0]),float_cmp);for(i=0;i

使用qsort函数进行结构体数组的排序

以学生信息结构体为例,结构体包括学生名字和学生年龄

以名字为基准进行比较

#include
#include
#includestruct student
{char name[10];int age;
};//以名字来对结构体进行排序
int struct_cmp_byname(const void* e1, const void* e2)
{return strcmp(((struct student*)e1)->name, ((struct student*)e2)->name);
}int main()
{int i=0;struct student stu[3] = { {"张三",20},{"李四",19},{"王五",18}};int sz = sizeof(stu) / sizeof(stu[0]);qsort(stu, sz, sizeof(stu[0]), struct_cmp_byname);for (i = 0; i < sz; i++){printf("%s %d\n", stu[i].name, stu[i].age);}
}

以年龄为基准进行比较 

#include
#include
#includestruct student
{char name[10];int age;
};//以年龄来对结构体进行排序
int struct_cmp_byage(const void* e1, const void* e2)
{return ((struct student*)e1)->age - ((struct student*)e2)->age;
}int main()
{int i=0;struct student stu[3] = { {"张三",20},{"李四",19},{"王五",18}};int sz = sizeof(stu) / sizeof(stu[0]);qsort(stu, sz, sizeof(stu[0]), struct_cmp_byage);for (i = 0; i < sz; i++){printf("%s %d\n", stu[i].name, stu[i].age);}
}

写在最后

👍🏻点赞,你的认可是我创作的动力!

⭐收藏,你的青睐是我努力的方向!

✏️评论,你的意见是我进步的财富!

相关内容

热门资讯

“分了,早分了”!98.5%的... 5年了,你分了吗? 分了分了,早分了! 你是否还记得 5年前,那件让街坊邻里 想到就不禁“头大”的小...
2025干杯音乐节10月中旬登... 人民网上海9月19日电 (记者董志雯)哔哩哔哩(以下简称“B站”)正式宣布,其发起的大型线下音乐节I...
原创 胜... 大家好!今天我们来讨论一个大家都可能会关心的话题——官司胜诉后,律师费到底由谁来承担?这个问题一听就...
【世界说】外媒:“大而美”给的... 中国日报网9月19日电 综合外媒报道,特朗普政府及共和党一直为其“大而美”法案中的大规模减税政策辩护...
解码发展机遇 凝聚青春力量——... 时代发展日新月异,如何帮助干部群众准确把握时代发展大势与国家方针政策,进而增强发展信心,凝聚精神力量...
重要通告!济宁市调整2025年... 广大消费者及汽车销售企业: 按照国家和省关于保障消费品以旧换新政策有序实施的要求,决定优化调整202...
上海楼市重磅政策!符合条件者首... 8月25日,上海发布《关于优化调整本市房地产政策措施的通知》,其中指出“为衔接优化住房限购政策,《通...
两具男尸多年无人认领,内蒙古一... 9月17日,内蒙古乌兰察布医学高等专科学校附属医院发布关于认领无名尸体的公告: 乌兰察布医学高等专科...
华夏银行关于个人消费贷款财政贴... 为贯彻落实党中央、国务院关于大力提振消费、全方位扩大国内需求的决策部署,根据财政部、中国人民银行、金...
90万股历史股权纠纷案!长城证... 本文自南都·湾财社 采写 | 南都·湾财社记者 吴鸿森 日前,据天眼查显示,长城证券新增了一则开庭公...