本文小编为大家详细介绍“C语言的qsort()函数如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言的qsort()函数如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
qsort()函数(quick sort)是八大排序算法中的快速排序,能够排序任意数据类型的数组其中包括整形,浮点型,字符串甚至还有自定义的结构体类型。
void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*));
上图是qsort函数各个参数的含义,让我们一个个来看。
我们要排序一组数据,首先我们需要找到这组数据在哪,因此我们直接将首元素的地址传给qsort函数来确定从哪开始排序。
我们知道了从哪开始,也要知道在哪结束才能确定一组需要排序的数据,但是我们不方便直接将结尾元素的地址传入函数,因此我们将需要排序的元素的个数传给qsort函数来确定一组数据。
我们知道qsort函数能排序任意数据类型的一组数据,因此我们用void*类型的指针来接收元素,但是我们知道void*类型的指针不能进行加减操作,也就无法移动,那么在函数内部我们究竟用什么类型的指针来操作变量呢?我们可以将void*类型的指针强制类型转换成char*类型的指针后来操作元素,因为char*类型的指针移动的单位字节长度是1个字节,我们只需要再知道我们需要操作的数据是几个字节就可以操作指针从一个元素移动到下一个元素,因此我们需要将元素大小传入qsort函数。
我们需要告诉qsort函数我们希望数据按照怎么的方式进行比较,比如对于几个字符串,我们可以比较字符串的大小(strcmp),也可以比较字符串的长度(strlen),因此我们要告诉qsort函数我们希望的比较方式,我们就需要传入一个比较函数compar就简写为cmp吧。
要使用qsort函数我们首先需要引用一个头文件<stdlib,h>
#include <stdlib.h>
qsort函数给cmp函数规定了特定的参数。因此我们设计cmp函数时要严格遵守其参数设定。
int compar (const void* e1, const void* e2);
如果你要比较的数据是整形:
int cmp_int(const void* e1, const void* e2) { return *(int*)e1 - *(int*)e2; }
如果你要比较的数据是浮点型:
int cmp_float(const void* e1, const void* e2) { return (int)(*(float*)e1 - *(float*)e2); }
如果你要比较的是字符串的大小:
int cmp_str_len(const void* e1, const void* e2) { return strlen((char*)e1)-strlen((char*)e2); }
如果你要比较的是字符串的长度:
int cmp_str_len(const void* e1, const void* e2) { return strlen((char*)e1)-strlen((char*)e2); }
如果你要比较的数据是结构体变量:
int cmp_by_age(const void*e1, const void*e2) { return (int)(((stu*)e1)->weight - ((stu*)e2)->weight); }
需要注意的是:返回结果一定要确保是整形,如果不是一定要强制类型转换成整形!
快速排序结构体变量示例:
#include <stdlib.h> typedef struct stu { //char name; int age; float weight; double hight; }stu; int cmp_by_age(const void*e1, const void*e2) { return (int)(((stu*)e1)->weight - ((stu*)e2)->weight); } int main() { stu class1[3] = { {17,185.5,190.8}, {16,160.9,200.7}, {18,120.3,150.5} }; int sz = sizeof(class1) / sizeof(class1[0]); int i; qsort(class1, sz,sizeof(class1[0]), cmp_by_age); for (i = 0; i < 3; i++) { printf("%.1f\n", class1[i].weight); } return 0; }
读到这里,这篇“C语言的qsort()函数如何使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。