失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > C++之指针探究(十五):回调函数应用之qsort排序

C++之指针探究(十五):回调函数应用之qsort排序

时间:2021-01-23 11:59:40

相关推荐

C++之指针探究(十五):回调函数应用之qsort排序

相关博文:C++之指针探究(十三):函数指针数组

相关博文:C++之指针探究(十二):指针、下标、数组及其作函数参数探究

相关博文:C++之指针探究(十一):函数名的本质和函数指针

相关博文:C++之指针探究(八):指针函数和函数指针

相关博文:C++之指针探究(十四):回调函数

qsort

标准库为我们封装的基于数组快速排序的万能接口。

例1:qsort升序排序,这里声明为int myCompare(const void∗\ast∗ pa,const void∗\ast∗ pb)是为了泛型编程。下面(int∗\ast∗)pa使用了对一级指针的强制类型转换。

运行结果:

附例1代码:

//小问学编程#include <stdio.h>#include <stdlib.h>//泛型编程int myCompare(const void* pa,const void* pb){if(*(int*)pa > *(int*)pb)return 1;elsereturn -1;//或// return *(int*)pa - *(int*)pb;//升序// return *(int*)pb - *(int*)pa;//降序}int main(void){int arr[10] = {6,5,4,3,2,1,7,8,9,0};qsort(arr,10,4,myCompare);for(int i=0;i<10;i++){printf("%d\n",arr[i]);}return 0;}

回调函数举例

以int类型数组为例,实现升序排列,qsort只对compare返回的正值感兴趣,也就是当返回正值才发生交换行为。

整型类示范:

字符型示范:

对结构体一级排序:

对结构体二级排序:

例2:对字符串排序,下面的(char∗\ast∗∗\ast∗)pa使用了对二级指针的强制类型转换。

运行结果:

附例2代码:

//小问学编程#include<stdio.h>#include<stdlib.h>#include <string.h>int myCompare(const void* pa,const void* pb){//对二级指针进行强制类型转换if(strcmp(*(char**)pa,*(char**)pb)>0)return 1;elsereturn -1;}int main(){char* pa[4]={"China","Apple","Google","Huawei"};qsort(pa,4,4,myCompare);for(int i=0;i<4;i++){printf("%s\n",pa[i]);}return 0;}

例3:对下面的结构体进行二级排序,要求:先按名字排序,如果名字相同,则按成绩排序。

运行结果:

附例3代码:

//小问学编程#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct _stu{char name[10];float score;}Stu;int myxx(const void* pa,const void* pb){if(strcmp(((Stu*)pa)->name,((Stu*)pb)->name)>0)return 1;else{return((Stu*)pa)->score-((Stu*)pb)->score;}}int main(){Stu stu[]={{"aaa",23.5},{"bbb",13.5},{"bbb",43.5},{"ccc",53.5},{"ddd",13.5},};qsort(stu,sizeof(stu)/sizeof(*stu),sizeof(Stu),myxx);for(int i=0;i<5;i++){printf("%s %f\n",stu[i].name,stu[i].score);}return 0;}

如果觉得《C++之指针探究(十五):回调函数应用之qsort排序》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。