1. C语言数据库<stdlib.h>
使用qsort函数之前必须包含该数据库
2. qsort函数的使用
2.1 qsort函数的声明
C语言中的规定标准为:
//qsort 函数声明
void qsort(void* base,size_t nitems, size_t size, int (*compar)(const void *, const void*))
代码中的实际使用格式:
void qsort(void* base, int nitems, int size, int (*compar)(const void*, const void*))
2.1.1 参数
* base--指向要排列数组的首元素地址
* nitems--指向要排列数组的数组个数
* size--指向要排列数组内的一个元素大小
* compar--比较俩个元素的函数(自定义函数)
2.1.1.1 参数类型
void* base
这里的指针之所以是void类型的,是为了适应更多的数组排序情况
如果这里是int*、short*、 char*、 float*等固定的指针类型,那么该qsort函数的适用性将大大减少
应为base为指向要排列数组的首元素地址, 数组的类型有很多,不可能每次要排序的数组都刚好是int、char、double等类型,所以开发者为了使qsort函数的适用性更广,这里选择了void类型
(void类型的指针变量,可以存放任何类型的地址,非void类型的指针变量,只能存放相对应的类型的地址)
void (*compar)(const void*, const void*)
首先这是函数指针类型,compar是函数指针变量
const是为了保证后面的参数,无法通过*p(这里的p代表指针变量)来改变他的值
2.2 qsort函数的使用
#include<stdio.h>
#include<stdlib.h>
//比较函数
int compar(const void* p1, const void* p2)
{
//return *((int*)p2) - *((int*)p1);——为降序
return *((int*)p1) - *((int*)p2);//升序
//这里需要注意 void类型的是不能直接加(*)解引用的,应为计算机不知道void类型的指针大小是多少,所以这里需要我们强制转化为相对应的指针类型
}
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };//定义一个降序的数组
int nitems = sizeof(arr) / sizeof(arr[0]);//求数组元素个数
qsort(arr, nitems, sizeof(arr[0]), compar);//首元素地址、元素个数、单个元素大小、比较函数
for (int i = 0; i < nitems; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
运行结果:
0 1 2 3 4 5 6 7 8 9
这里就是要注意int compar(const vodi* p1, const void* p2) 中的const不要忘了
还有该函数体内的强制转换部分,一定是转换成和需要排列数组的类型相对应的指针类型
#include<stdio.h>
#include<stdlib.h>
//定义结构体
struct stu
{
char name[20];//名字
int age;//年龄
};
//比较函数
int com_par(const void* p1, const void* p2)
{
//这里需要注意的是在强制转换的时候,注意类型是结构体类型
return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);//这里'.'和'->'都可以实现只要定位到name就可以
}
int main()
{
struct stu add[] = { {"zhangsan",99}, {"lisi", 20}, {"wangwu", 88} };
int sz = sizeof(add) / sizeof(add[0]);
qsort(add, sz, sizeof(add[0]), com_par);//首元素地址、数组元素个数、单个元素大小,比较函数
for (int i = 0; i < sz; i++)
{
printf("%s %d\n", add[i].name, add[i].age);
}
return 0;
}
运行结果:
lisi 20
wangwu 88
zhangsan 99
这一段代码我们比较的是字符串,所以就用到了strcmp(x,y)函数(字符串比较函数),如果 传入该函数的值相等,那就返回0,如果x>y那就返还大于零的数,如果小于那就返还小于零的数
其次就是强制类型转换,一定要转换成相对应的数组类型