相关博文: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;}