目录
❄️一、什么是qsort函数?
qsort里边需要的四个参数
void*base:
num:
size:
cmp:
❄️二、基本的参数介绍完毕,那么如何用?
1.测试整数数据排序
2.测试结构体按名字排序
3.测试结构体按年龄排序
三、注意:
吸粉狂魔小姑娘,祝我访问量破千
排序我们已经见过很多了有冒泡排序,插入排序,选择排序,堆排序,快速排序·····而qsort运用的就是快速排序来实现的。
直接运用这个函数的话既可以很方便的对各种类型数据进行排序
qsort---C语言标准库提供的排序函数 ,需要引入头文件(#include
//int (*cmp)(const void*e1,const void* e2)
qsort(void*base,num,size,cmp);
base:传进去数据的起始地址
num:待排序的元素个数
size:数组中一个元素的大小
int (*cmp)(const void*,const void*)比较两个元素大小的函数指针
它代表的是要排序的序列首元素的地址
这个对于数组来说传进去的就是数组名比如想要排序arr[10]里边的元素直接在第一个位置传arr
这个代表的意义是需要排序的数据的个数,一般用sizeof(数组名)/sizeof(数组中某个元素)求得
因为不知道传进去的是什么类型元素,所以需要传进去元素内存的大小,sizeof(数组中某个元素)
这是个比较函数,用于比较传进去的整形呀字符呀或者结构体元素的大小,这个需要我们自己去写这个函数,然后调用。
这里说一下比如a和b比较,a>b的话需要这个函数返回一个大于0的数,a==b则需要返回0,a
需要我们写的函数只有一个,就是比较函数cmp
int cmp_int(const void* e1,const void* e2)
{
return *(int*)e1 - *(int*)e2;
}//这里做差,恰好符合函数的定义,大于的话返回大于0的数。。。。。
之后我们把需要排序的数据做出来
void print1(int* arr, int num)
{
int i = 0;
for (i = 0; i < num; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[] = { 4,2,6,8,3,4,1,10,9,5 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, arr[0], cmp_int);//代入各个数据
print1(arr, sz);
return 0;
}
因为需要打印出来观察结果,所以就写了一个print1函数,下边是测试结果
完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int cmp_int(const char* e1,const char* e2)
{
return *(int*)e1 - *(int*)e2;//因为传进去的是空类型,现在传进去的是int类型,所以需要强制类型转换成int类型,加个(int*)
}
void print1(int* arr, int num)
{
int i = 0;
for (i = 0; i < num; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[] = { 4,2,6,8,3,4,1,10,9,5 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, arr[0], cmp_int);
print1(arr, sz);
return 0;
}
先写tmp函数,这里我们是根据名字比较的,所以这个tmp函数需要用到strcmp()函数来比较
int cmp_stu_by_name(const void* e1, const void* e2)//用于比较名字的函数,因为是字符串,所以需要字符串函数
{
return strcmp( ((stu*)e1)->name, ((stu*)e2)->name);//因为传进去的是空类型,现在传进去的是结构体类型,所以需要强制类型转换成结构体类型,加个(stu*)
}
之后把需要测试的数据写出来,因为结构体打印不方便,我这里用的是调试来观察是否排序,下边是完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
typedef struct stu//定义一个结构体,这个定义要在最前边
{
char name[20];
int age;
}stu;
int cmp_stu_by_name(const void* e1, const void* e2)//用于比较名字的函数,因为是字符串,所以需要字符串函数
{
return strcmp( ((stu*)e1)->name, ((stu*)e2)->name);
}
int main()
{
stu stu1[] = { {"zhangsan",34},{"lisi",56},{"wangwu",44} };
int sz = sizeof(stu1) / sizeof(stu1[0]);
qsort(stu1, sz, sizeof(stu1[0]), cmp_stu_by_name);
return 0;
}
运行之后可以看出,第一张是进入排序函数前的结果,第二张是排序后的结果,可以看出的确排序了。
因为年龄是整数,这个比较函数cmp跟整数的大差不差
int cmp_stu_by_age(const void* e1, const void* e2)//用于比较年龄的函数
{
return ((stu*)e1)->age-((stu*)e2)->age;
}
下边是测试的数据,可以看出第一张是原始数据,第二张是排序后的年龄。
完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
typedef struct stu//定义一个结构体,这个定义要在最前边
{
char name[20];
int age;
}stu;
int cmp_stu_by_name(const void* e1, const void* e2)//用于比较名字的函数,因为是字符串,所以需要字符串函数
{
return strcmp( ((stu*)e1)->name, ((stu*)e2)->name);
}
int cmp_stu_by_age(const void* e1, const void* e2)
{
return ((stu*)e1)->age-((stu*)e2)->age;
}
int main()
{
stu stu1[] = { {"zhangsan",34},{"lisi",56},{"wangwu",44} };
int sz = sizeof(stu1) / sizeof(stu1[0]);
qsort(stu1, sz, sizeof(stu1[0]), cmp_stu_by_age);
return 0;
}
里边包含了第一个测试
每次传进去的第四个参数比较函数是不同的,结构体的定义需要在最前边才可以运用,另外这个底层用的排序函数用的是快排。
下一文我会用我们熟悉的冒泡函数来实现这个排序函数。
码文不易,各位阔以三连嘛~~~