【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);}
}

写在最后

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

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

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

相关内容

热门资讯

ST德豪:董事会成员构成符合法... 证券之星消息,ST德豪(002005)12月25日在投资者关系平台上答复投资者关心的问题。 投资者提...
交付的电芯存在严重质量问题?欣... 截至目前,国内罕有因交付电芯出现质量问题而和客户对簿公堂的动力电池制造商。老牌锂电企业欣旺达电子股份...
警惕“上门防水补漏”陷阱!广州... 南都讯 记者赵青 通讯员唐明伯 近日,广州法院审结一起以“上门防水补漏”为幌子的恶势力组织犯罪案件。...
天风证券融券余额599.37万... 雷达财经雷助吧出品 文|肖文竹 编|深海 东财Choice数据显示,2025年12月25日,天风证券...
突发涨停!氧化铝的“政策牛”能... 界面新闻记者 | 田鹤琪 在 “跌跌不休” 的持续低迷后,国内氧化铝期货突发涨停。 12月26日,...
原创 秦... 西安碑林博物馆的《峄山刻石》前,常有游客指着“皇帝立国,维初在昔”的刻字感叹:“就这么个强大的帝国,...
原创 《... 一场意外的车祸,一具深埋的尸骨。 穷小子和富家女命运交织,携手探索陈年黑暗的故事。 《人之初》明天...
亚光科技:紧抓政策机遇实现船艇... 证券之星消息,亚光科技(300123)12月25日在投资者关系平台上答复投资者关心的问题。 投资者提...
信息发展(300469)披露修... 截至2025年12月26日收盘,信息发展(300469)报收于64.27元,较前一交易日下跌0.2%...