qsort函数,是C语言库中自带的一个函数
它存在于stdlib.h库中
作用是:它是一个排序函数。
qsort函数的实现基于快速排序算法。
qsort函数如下:
void qsort (void* base,
size_t num,
size_t width,
int (*compar)(const void* e1,const void* e2)
);
- base:指向要排序的数组的第一个对象的指针,转换为void*。
- num:指向的数组中的元素数个数。size_t是无符号整数类型。
- width:数组中每个元素的字节大小。size_t是无符号整数类型。
- compar:排序规则函数的地址。
compar函数的返回值,稍微有点复杂:
(e1 - e2)与0关系 | 排序顺序 |
---|---|
<0 | 指向e1的元素位于e2之前 |
=0 | 指向e1的元素等效于e2 |
>0 | 指向e1的元素位于e2之后 |
实际运用1:(按照年龄排序)
#include<stdio.h>
struct STU
{
char name[20];
int age;
};
int compar_age(const void* e1, const void* e2)
{
return ((struct STU *)e1)->age - ((struct STU *)e2)->age;
}
void test()
{
struct STU s[3] = { { "zhangsan", 20 }, { "lisi", 50 }, { "wangwu", 33 } };
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]), compar_age);
for (int i = 0; i < 3; i++)
{
printf("STU类型的s[%d]:叫%s,年龄是:%d。\n", i, s[i].name, s[i].age);
}
}
int main()
{
test();
return 0;
}
实际运用时,排序规则是使用者自己写的,也就是自己想怎么排,就怎么写。
以上就是排序规则。
关于这个函数,首先要看的是强转,其次是减法操作。
强转
因为这个函数创造者在创建这个函数时,无法确定使用者的排序的数据类型,因此创造者使用的是void * ,也就是空类型的指针。而编辑这个函数时,我们对于数据类型是知道的,所以进行强转,将参数强转为我们排序的数据的类型。
减法操作;其实就是关于e1和e2谁减谁的问题,其实很好理解。
-
如果:
e1减e2,排序顺序就是从小到大 -
如果:
e2减e1,排序顺序就是从大到小
进一步简化:
1减2,小到大
2减1,大到小
实际运用2:(按照姓名排序)
#include<stdio.h>
#include<string.h>
struct STU
{
char name[20];
int age;
};
int compar_name(const void* e1, const void* e2)
{
return strcmp(((struct STU *)e1)->name, ((struct STU *)e2)->name);
}
void test()
{
struct STU s[3] = { { "zhangsan", 20 }, { "lisi", 50 }, { "wangwu", 33 } };
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]), compar_name);
for (int i = 0; i < 3; i++)
{
printf("STU类型的s[%d]:叫%s,年龄是:%d。\n", i, s[i].name, s[i].age);
}
}
int main()
{
test();
return 0;
}
按照姓名排序,compar函数里面直接使用strcmp函数即可。
strcmp函数的返回值也是看两个参数的大小。
以上就是qsort函数理解和两个实例。