qsort,是C语言库函数,用于排序,使用这个库函数需要#include <stdlib.h>头文件
语法:void qsort(void* base,size_t num,size_t width,int( *cmp)(const void *e1,const void *e2));
void* base是指要排序的数组的首元素位置size_t num是指数组的元素个数size_t width是指数组内每个元素的大小,单位是字节int( *cmp)(const void *e1,const void *e2)是函数指针,比较两个元素用的函数的地址,此函数需自己实现。
参见:指针详解
关于void*:
- void* 类型的指针可以接收任意类型的地址
- 对于void*类型的指针不能进行解引用操作
- void*类型的指针也不能进行加减整数的运算
使用qsort对整型数组排序:
12345678910111213141516 | int cmp_int(const void* e1,const void* e2){ //比较函数,比较两个整型值 return *(int*)e1 - *(int*)e2;}int main() { int arr[10] = {9,8,7,6,5,4,3,2,1,0}; int sz = sizeof(arr)/sizeof(arr[0]); qsort(arr,sz,sizeof(arr[0]),cmp_int); int i = 0; for (i=0; i<sz; i++) { printf("%d ",arr[i]); } return 0; |
使用qsort函数对arr数组排序,打印的结果是0 1 2 3 4 5 6 7 8 9
使用qsort对float型数组排序:
12345678910111213141516171819202122232425 | int cmp_float(const void* e1,const void* e2){ if (*(float*)e1 == *(float*)e2) { return 0; }else if (*(float*)e1 > *(float*)e2) { return 1; }else { return -1; }}int main() { float f[10] = {9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0,1.0,0.0}; int sz = sizeof(f)/sizeof(f[0]); qsort(f,sz,sizeof(f[0]),cmp_float); int i = 0; for (i=0; i<sz; i++) { printf("%f ",f[i]); } return 0;} |
使用qsort对float型数组排序:
123456789101112131415161718192021222324 | struct Stu{ char name[20]; int age;};int cmp_stu_by_age(const void* e1,const void* e2){ return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;} int cmp_stu_by_name(const void* e1,const void* e2){ //比较名字,也就是比较字符串,不能直接用大于、小于、等于比较、应该用strcmp函数 return strcmp(((struct Stu*)e1)->name,((struct Stu*)e2)->name);} int main() { struct Stu s[3] = {{"zhangsan",20},{"lisi",25},{"wangwu",50}};//结构体数组 int sz = sizeof(s)/sizeof(s[0]); qsort(s,sz,sizeof(s[0]),cmp_stu_by_age); return 0;} |