ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C语言库函数qsort()详解

2021-12-29 09:04:59  阅读:220  来源: 互联网

标签:int void qsort C语言 str sizeof e2 e1 库函数


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调换位置即可。

标签:int,void,qsort,C语言,str,sizeof,e2,e1,库函数
来源: https://blog.csdn.net/weixin_62244902/article/details/122205206

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有