C语言 实现一个比较两个整型的函数 / qsort的使用 /qsort排序结构体

一、qsort的一般使用方法

int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
//
//使用qsort对数组进行排序,升序
void test1()
{

	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//bubble_sort(arr, sz);
	//库函数中一个排序函数:qsort
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	//0 1 2 3 4 5 6 7 8 9
	//打印
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
int main()
{
	test1();
	return 0;
}

int cmp_int()

cmp_int  是 qsort  所需的比较函数,用于比较两个 int  元素。 qsort  靠它决定元素顺序。其参数 e1  和 e2  为 void*  指针,需转为 int*  后解引用得实际 int  值。返回值 *(int*)e1 - *(int*)e2  依两元素大小关系,分别为负、0、正,符合 qsort  要求,实现升序排序。

void test1():

 首先,定义并初始化一个整数数组 arr ,包含10个元素 {9, 8, 7, 6, 5, 4, 3, 2, 1, 0} 。


然后,计算数组的元素个数 sz 。 sizeof(arr) 返回整个数组的字节大小, sizeof(arr[0]) 返回数组中一个元素的字节大小,两者相除得到数组元素的个数。


调用 qsort 函数对数组 arr 进行排序。 qsort 函数的第一个参数是要排序的数组的起始地址,即 arr ;第二个参数是数组元素的个数 sz ;第三个参数是每个数组元素的大小,这里是 sizeof(arr[0]) ;第四个参数是比较函数的指针,即 cmp_int 。 qsort 函数会根据 cmp_int 函数的比较结果对数组进行排序。
最后,通过一个 for 循环遍历排序后的数组,并使用 printf 函数将每个元素打印出来。

二、使用qsort排序结构体

//一、使用qsort 排序结构体
struct Stu
{
	char name[20];
	int age;
};

//按照学生的年龄来排序
int cmp_stu_by_age(const void* e1, const void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
按名字来排序
//int cmp_stu_by_name(const void* e1, const void* e2)
//{
	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
//}

void test2()
{
	struct Stu s[3] = { {"zhangsan",20}, {"lisi", 50}, {"wangwu", 33} };
	int sz = sizeof(s) / sizeof(s[0]);
	//qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
	qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}

int main()
{
	test2();
	return 0;
}

↑1、定义结构体 struct Stu

2、定义比较函数  int cmp_stu_by_age(const void* e1, const void* e2)

该函数借 qsort 排序结构体数组。 qsort 调用此函数比两结构体元素。 e1 、 e2 为 void* 指针,指向待比较元素。函数转其为 struct Stu* ,以 -> 访 age 成员,返回年龄差值,供 qsort 依差值正负定序,实现按年龄升序排序 。

3、test2() 函数的主要作用:是创建一个结构体数组,并使用 qsort 函数对其进行排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天学习了么!?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值