目录
⚽️🏀库函数qsort的使用方法🏀⚽️
🥬🥬我们可以看到qsort()库函数有4个参数:
分别是:1.void*base
指向排序的数组的第一个对象的指针。为什么是用void* 指针类型来接受呢?因为qsort()设计的时候可以排序多种类型的。但是这个函数的作者并不知道我们使用者需要排序什么类型的数据,传参的是什么类型的指针,void*类型的指针是比较宽容的,可以接收多种类型的指针。
2.size_t num
待排序元素的个数
3.size_t size
每一个元素所占内存空间大小,单位是(字节)
4.int (*cmp )(const void*p1,const void*p2)
这是一个函数指针,指向我们需要调用的函数。这个调用的函数是用来设置比较方法的。为什么要设置比较的方法呢?因为我们每一种类型的比较方法是不一样的。整形(int)类型
我们知道要用 > 、<、 =、来比较,字符串就不可以用我们用 > 、<、 =、来比较了,strcmp()库函数来比较大小;还有一些其他的类型,所以我们要自己设置一个比较函数传参给qsort函数(回调函数的使用)。
p1和p2分别指向两个需要比较的元素。
🌈qsort()库函数使用例子代码🌈
//void qsort (void* base, size_t num, size_t size, int (*compar)(const void*, const void*));
//void*base :需要排序元素的首元素地址,用base指针来接收
//size_t num:待排元素的个数
//size_t size:每个元素所占用空间的大小,单位是字节
//int(*compar)(const void*,consr void*):函数指针,因为每一种元素的排序方法是不一样的,需一个函数来实现比较,函数的返回类型是int
struct stu
{
char name[20];
char sex[20];
int age;
};
int zx(const void* a, const void* b)//整数比较方法
{
return (*(int*)a - *(int*)b);
}
int jgtname(const void* a, const void* b)//结构体name比较
{
return strcmp(((struct stu*)a)->name, ((struct stu*)b)->name);
}
int jgtage(const void* a, const void* b)
{
return ((struct stu*)a)->age - ((struct stu*)b)->age;
}
void test1()
{
printf("排序前:\n");
int arr[] = { 2,9,5,7,6,8,2,4,4,3 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
qsort(arr, sz, sizeof(int), zx);//整形数组排序
printf("排序后:\n");
for( i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
void test2()
{
struct stu s[] = { { "zhangsa