C语言库函数qsort()详解
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调换位置即可。
下一篇:
关于程序中scanf函数失效的解决方法