🦄个人主页:-雷阵雨-
⚙️操作环境:Visual Studio 2022
一:qsort()函数的基本信息和功能
在日常生活中总会遇到一些需要排序的问题,比如商品价格的比较,将身高从高到低需要排序,按照首字母的顺序排序........那么怎么根据电脑的某种程序可以完成这写问题的排序?
接下来给大家展示一下在C语言函数库中可以使用一个排序的函数,qsort()函数;
先解释一下qsort()的定义:qsort()函数是C语言库函数中的一种排序函数,排序方法是快速排序(quick sort)。特点就是可以排序任何类型的数组元素。
1.1:qsoprt()函数原型
void qsort(void* base, size_t num, size_t size, int (*cmp)(const void*,const void*) )
这个是qsort()函数的原型,需要引用的头文件:<stdlib>
1.2:函数参数介绍
1:void* base
qsort ()函数需要的第一个参数是数组的首元素的地址,void* 是一个无类型的指针,是希望我们可以排序很多数据类型。
2:size_t num
qsort ()函数需要的第二个参数是待排数组元素个数。因为元素个数为非负数,使用数据类型为size_t(无符号整型)。
计算数组元素个数我们常用的函数是sizeof,即数组元素个数=数组总长度/数组首元素的长度;如下:
int sz = sizeof(arr) / sizeof(arr[0]);
这样我们就可以求出数组长度。
3:size_t size
一个元素的大小,单位是字节
qsort ()函数需要的第三个参数是待排数组每个元素的长度。计算每个元素的长度也是使用sizeof;如:
int sz = sizeof(arr[0])
这样单个元素的长度就出来了。
4:int (*compar)(const void*,const void*)
函数指针类型,也算测试函数,这个函数指针指向的函数,能够比较指向数组中两个元素。比较函数。
1.compar()函数的作用仅仅是比较两个参数的大小,然后通过返回值的形式告诉我们qsort()函数两个参数比较的结果,在运行期间是不能更改参数的指,所以我们为了保险,给了两个参数加上了const修饰,参数的数值无法改变。
小知识点:const修饰的指针,在*左右表示的的意义不同,在*左边即为固定指向的指不发生变化,在*右边即指针指向的方向不发生改变。可以简记:左定值,右定向。
compar()函数编写样式:
最最最重要,也是我在编写是犯糊涂了:
注意:在这个compare()函数是你自己定义的,在qsort()函数中是你自己在定义这个函数,自己在compare()这个函数中编写测试代码,就是大于0,等于0,小于0然后返回值传给qsort()函数,进行排序。
当接收到compare()返回值的是一个有符号在整型数字,当接收compare返回值大于零时,qsort()函数就会将这两个元素进行交换,反正如果小于0就是不交换。
int cmp_int(const void* p1, const void* p2) { return (*(int*) p1) - (*(int* )p2); }
因此我们在cmp_int函数可以这样来判断,返回值在零的那一侧,这样的是升序,如果需要降序可以将p1和p2进行调换。
给大家解释一下这个代码 p1就是参数,int*就是类型,然后大括号外面*是解引用。
小知识点:void*类型指针:可以接受任何类型的地址,但是不能对其进行解引用操作,和不能对其进行加减整数的操作。
下面随便列举一些常用的compare()比较函数:
1:对一维数组进行排序
int cmp_int(const void* p1, const void* p2) { return (*(int*) p1) - (*(int* )p2); }
2:对二维数组进行排序
int cmp_int(const void* p1, const void* p2) { return ((int*) p1)[0] - ((int* )p2)[0]; }
3:对字符串进行排序
int cmp_int(const void* p1, const void* p2) { return strcmp(*(char*)p1,*(char*)p2); }
4:对结构体中某个关键字进行排序
先创建个结构体
typedef struct { char name[20]; int age; }stu;
对学生姓名排序
int cmp_int_grade(const void* p1, const void* p2) { return ((struct stu*)p1)->name - ((struct stu*)p2)->name; }
对学生成绩排序
int cmp_int_grade(const void* p1, const void* p2) { return ((struct stu*)p1)->grade- ((struct stu*)p2)->grade; } void test2() { struct stu arr[] = { {"zhnagsan",66},{"lisi",90},{"wamhwu",65} }; int sz = sizeof(arr) / sizeof(arr[0]); qsort(arr, sz, sizeof(arr[0]), cmp_int_grade); }
二:qsort()函数使用
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> //void qsort(void* base, // size_t num, // size_t size, // int (*cmp)(const void*,const void*) // ) struct stu { char name[20]; int grade; }; int cmp_int_grade(const void* p1, const void* p2) { return ((struct stu*)p1)->grade- ((struct stu*)p2)->grade; } int cmp_int_grade(const void* p1, const void* p2) { return ((struct stu*)p1)->name - ((struct stu*)p2)->name; } void test2() { struct stu arr[] = { {"zhnagsan",66},{"lisi",90},{"wamhwu",65} }; int sz = sizeof(arr) / sizeof(arr[0]); qsort(arr, sz, sizeof(arr[0]), cmp_int_grade); } //int arr[10] = { 9,0,7,8,2,3,4,6,5,1 }; //int cmp_int(const void* p1, const void* p2) //{ // return (*(int*) p1) - (*(int* )p2); //} //int cmp_int(const void* p1, const void* p2) //{ // return strcmp(*(char*)p1,*(char*)p2); //} //test(){ // // int sz = sizeof(arr) / sizeof(arr[0]); // qsort(arr, sz, sizeof(arr[0]), cmp_int); // //} //int print() //{ // int i = 0; // for (i = 0; i <= 9; i++) // { // printf("%d ", arr[i]); // } //} int main() { //test(); //print(); test2(); return 0; }
这就是全部函数有兴趣可以去做一些,简单的排序。