目录
一、qsort函数的介绍
1、整形数组
2、字符数组
3、字符串
4、结构体
二、qsort函数的使用
一、qsort函数的介绍
qsort函数是一种底层快速排序的函数,它的特点就是可以排序任意类型的数据,比如:整形、字符串、浮点型、以及结构体类型。
具体用法如下:
1、void* base:表示待排序数组的起始地址;
2、size_t num:表示数组元素的个数;
3、size_t size:表示一个数组元素的大小(单位字节);
4、int (*compar)(const void*, const void*):表示比较两个元素大小的函数指针,指向的函数是排序函数,所包含的两个参数为比较元素的地址,最后参数的类型为void*,这样可以接收任意形式的参数。
1、整形数组
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
上述函数是自定义的比较函数,函数的返回类型为 int 类型,如果<0时,e1小于e2,如果>0时,e1大于e2,如果=0时,e1=e2。对两个元素指针进行强制类型转化为整型指针,再进行解引用得到比较元素的值,最后将两个元素的差值返回。
2、字符数组
int cmp_char(const void* e1, const void* e2)
{
return *(char*)e1 - *(char*)e2;
}
3、字符串
(1)按字符串首字母进行排序
int cmp_string(const void* e1, const void* e2)
{
return *(char*)e1 - *(char*)e2;
}
(2)按字符串长度进行排序
int cmp_string(const void* e1, const void* e2)
{
return strlen((char*)e1) > strlen((char*)e2) ? 1 : -1;
}
4、结构体
假如结构体如下:
struct Stu
{
char name[20];//姓名
int age;//年龄
}s;
(1)按名字排序
int cmp_stu_by_name(const void* e1, const void* e2)
{
return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
(2)如果名字相同,就按年龄排序
int cmp_stu_by_age(const void* e1, const void* e2)
{
if ((strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name)) != 0)
return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
else
return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
二、qsort函数的使用
1、对整形数组元素的排序使用
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
int main()
{
int arr[10] = { 5,7,9,3,1,6,2,4,0,8 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_int);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
运行结果:
2、 对结构体比较的使用
struct Stu
{
char name[20];
int age;
};
int cmp_stu_by_name(const void* e1, const void* e2)
{
if ((strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name)) != 0)
return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
else
return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
int main()
{
struct Stu s[] = { { "zhangsan", 20 }, { "wangwu", 18 }, { "zhaohu", 50 }, { "lisi", 44 }, { "mahan", 33 }, {"zhaohu",67} };
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
for (int i = 0; i < sz; i++)
{
printf("%s %d\n", s[i].name, s[i].age);
}
return 0;
}
运行如下:
本文要是有不足的地方,欢迎大家在下面评论,我会在第一时间更正。