C语言库函数qsort()详解

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

上一篇:2022-JAVA面试必背


下一篇:【C语言精讲】typedef和#define差异对比