1.函数参数
可以看到,这个函数参数主要有四个部分
(1)void*base,这个是要排序的数组/字符串/结构体等等的首元素地址。
(2)size_t num是排序的元素个数,单位是字节,size_t是unsigned int类型。
(3)size_t width是排序每个元素的大小,单位是字节。
(4)最后一个参数是一个比较函数的地址,这个比较函数可以理解成比较的方法,qsort通过调用这个方法来比较每个元素之间的关系,也就是说,在我们使用qsort之前,我们还得自己写一个比较函数,给qsort当模板。
(5)这个函数需要通过调用头文件<stdlib.h>
2.不同数据类型的具体实现(升序为例)
1.整形int
因为函数接e1和e2的类型都是void*,所以要先强制转换类型。
若要实现降序,return的时候将e1和e2颠倒下就可以实现。
int intcmp(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
int main()
{
int arr[6] = { 1,9,8,5,4,3 };
qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), intcmp);
}
2.字符char
int charcmp(const void* e1, const void* e2)
{
return *(char*)e1 - *(char*)e2;
}
int main()
{
char str[6] = {'a','s','d','f','g','c'};
qsort(str, sizeof(str) / sizeof(str[0]), sizeof(str[0]), charcmp);
return 0;
}
3.字符串char str[]
int charcmp(const void* e1, const void* e2)
{
return *(char*)e1 - *(char*)e2;
}
int main()
{
char str[6] = "adsbw";
qsort(str, (sizeof(str) / sizeof(str[0])-1), sizeof(str[0]), charcmp);
return 0;
}
4.浮点型double&float
int doublecmp(const void* e1, const void* e2)
{
return (int)(*(double*)e1 - *(double*)e2);
}
int main()
{
double arr[6] = { 1.1,0.8,3.14,2.1,0.4,1.7 };
qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), doublecmp);
return 0;
}
5.结构体
可以依据结构体的各个成员来比较。
typedef struct Stu
{
char name[20];
int age;
}stu;
int cmp_stu_age(const void* e1, const void* e2)
{
return ((stu*)e1)->age - ((stu*)e2)->age;
}
int main()
{
stu s[3] = { {"huangxiaoshun",20},{"zhangsan",29},{"lisi",17} };
qsort(s, sizeof(s) / sizeof(s[0]), sizeof(s[0]), cmp_stu_age);
return 0;
}
3.总结
qsort的关键在于比较函数的构建,注意要比较的函数的类型,排序的元素的灵活度较高,可*选择排序的依据,要实现降序的话只需将上面代码的e1和e2调换位置即可。