怎样建立门户网站,如何搭建一个app,站长之家网站排行榜,深圳哪家网站建设大家好#xff0c;我是苏貝#xff0c;本篇博客带大家了解qsort函数#xff0c;如果你觉得我写的不错的话#xff0c;可以给我一个赞#x1f44d;吗#xff0c;感谢❤️ 文章目录 一. qsort函数参数详解1.数组首元素地址base2.数组的元素个数num和元素所占内存空间大小w… 大家好我是苏貝本篇博客带大家了解qsort函数如果你觉得我写的不错的话可以给我一个赞吗感谢❤️ 文章目录 一. qsort函数参数详解1.数组首元素地址base2.数组的元素个数num和元素所占内存空间大小width3.自定义比较函数cmp 二. cmp函数1. 对整型数组排序char/short/int/long2 .对浮点型数组排序(float/double)3.对字符串长度和大小排序3.1 对字符串长度排序3.2 对字符串大小排序 4.对结构体排序 一. qsort函数参数详解 函数原型void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) ); 头文件stdlib.h 返回值无 1.数组首元素地址base
如果想将一组数据进行排序那么就要知道该数组首元素地址。base的类型为void* 代表base可以是任意类型的指针(地址)也就是说数组可以是任意类型的。比如base的类型为int * ,代表该数组的类型为intbase的类型为double * ,代表该数组的类型为double
2.数组的元素个数num和元素所占内存空间大小width
如果想将一组数据进行排序要知道该数组首元素地址和最后一个元素的地址但最后一个元素地址不方便作为参数所以要知道数组的元素个数num和一个元素所占内存空间大小width。size_t是无符号整型
3.自定义比较函数cmp
cmp原型int cmp(const void *a, const void *b ) ; a,b的类型为void * 也代表它们可以是任意类型的变量
注意 1.不管ab是何种类型的变量cmp返回值的类型永远是int 2.* a和 *b前都要加const确保 *a和 *b的值不会被改变 如果想了解const请点击该链接 二. cmp函数
先将a和b强制类型转换为数组的类型如数组的类型为int那么将a和b强制类型转换为int* 类型如数组的类型为double那么将a和b强制类型转换为double* 类型。再让指针变量pa和pb分别指向a和b指向的内容。用num1和num2分别存储pa和pb指向的内容。返回一个值注意对于不同的类型return后面的表达式也不尽相同
1. 对整型数组排序char/short/int/long
int cmp(const void* a, const void* b)
{int* pa (int*)a;int* pb (int*)b;int num1 *pa;int num2 *pb;return num1 - num2;//升序//return num2 - num1;//降序
}可以简写为
int cmp(const void* a, const void* b)
{return *(int*)a - *(int*)b;//升序//return *(int*)b - *(int*)a;//降序
}字符在内存中存储的是字符的ASCII码值ASCII码是整型所以char的写法同int
int cmp(const void* a, const void* b)
{return *(char*)a - *(char*)b;//升序//return *(char*)b - *(char*)a;//降序
}int main()
{char arr[6] { 1,3,4,2,8,6};qsort(arr, 6, sizeof(char), cmp);int i 0;for (i 0; i 6; i)printf(%c\n, arr[i]);return 0;
}2 .对浮点型数组排序(float/double)
cmp的返回值类型为int若数组为double如果用return (int)(* (char*)a - * (char*)b); 小数会被丢失造成结果不准确所以用下面的判断返回值
int cmp(const void* a, const void* b)
{return *(double*)a *(double*)b ? 1 : -1;//升序//return *(double*)a *(double*)b ? 1 : -1;//降序
}3.对字符串长度和大小排序
3.1 对字符串长度排序
int cmp(const void* a, const void* b)
{return strlen((char*)a) - strlen((char*)b);//升序//return strlen((char*)b) - strlen((char*)a);//降序
}int main()
{char arr[3][20] { hello world,yes,sir,dian ge zan ba };qsort(arr[0], 3, sizeof(arr[0]), cmp);int i 0;for (i 0; i 3; i)printf(%s\n, arr[i]);return 0;
}3.2 对字符串大小排序
int cmp(const void* a, const void* b)
{return strcmp((char*)a,(char*)b);
}int main()
{char arr[3][20] { hello world,yes,sir,dian ge zan ba };qsort(arr[0], 3, sizeof(arr[0]), cmp);int i 0;for (i 0; i 3; i)printf(%s\n, arr[i]);return 0;
}4.对结构体排序
对下面结构体数据中的语文成绩进行降序排序
typedef struct a
{char name[20];int Chinese;int Math;int English;
}student;int cmp(const void* a, const void* b)
{student* pa (student*)a;student* pb (student*)b;int num1 pa-Chinese;int num2 pb-Chinese;//return num1 - num2;//升序return num2 - num1;//降序
}int main()
{student stu[4] { {zhang,66,77,88},{lisi,60,70,80},{wangwu,73,76,98},{xuer,88,89,95}};qsort(stu, 4, sizeof(student), cmp);int i 0;for (i 0; i 4; i){printf(%s\t, stu[i].name);printf(%d\t, stu[i].Chinese);printf(%d\t, stu[i].Math);printf(%d\n, stu[i].English);}return 0;
}好了那么本篇博客就到此结束了如果你觉得本篇博客对你有些帮助可以给个大大的赞吗感谢看到这里我们下篇博客见❤️