关于qsort函数

一:qsort的作用

qsort其实就是头文件中的一个排序数组的函数,是一个可以排序任何类型的数组。

二:qsort的定义和格式

知道了qsort的作用之后,我们就得知道怎么使用qsort,在使用之前呢,我们可以先在头文件里寻找到qsort的定义

 通过qsort的定义可以看出,如果想要调用这个函数,需要void*base,size_t num,size_t size,int (*compar)(const void*,const void*)这四个参数,那么第一个参数显而易见,要我们输入的就是需要排序的数组地址。第二个参数呢,确实看不出来需要输入什么,但其实在定义的那里有说,我就不去找了,就是数组元素的个数。第三个就是数组每个元素的大小,单位是比特位。第四个参数接受的是一个返回类型为int,参数有俩个const void*的函数,所以需要我们自己定义一个函数先。

而这个函数要跟第四个参数的格式一样,返回类型得是int 里面俩个参数是const void*。如:

int pt(const void* e1, const void* e2)
{
	return 0;
}

这个函数的俩个参数是void*类型,这是因为这个函数被创造的时候,想要它可以实现所以类型的数组排序,所以就用了void*类型,需要排序什么类型,则需要使用者自己将参数强制类型转换,这样就可以实现所有类型的数组排序了(忍不住想问一下开发头文件的人,他们的大脑到底是什么做的)。然后返回的数据要满足一个要求,如果e1>e2,返回大于0的数据,如果e1=e2,返回0,如果e1<e2,返回小于0的数据,然后就是如果要调用qsort函数的话,需要引用头文件<stdlib,h>

比如要实现int类型的数组排序的话,如下:

int pt(const void* e1, const void* e2)
{
	return  * ((int*)e1) - *((int*)e2);
}

字符串数组:

int pt(const void* e1, const void* e2)
{
	return  ( * (char*)e1)- (* (char*)e2);
}
int main()
{
	char arr1[] = "asdfg";
	int b = strlen(arr1);
	int a = sizeof(arr1[0]);
	qsort(arr1, b,a, pt);
	printf("%s", arr1);
	return 0;
}

 

结构体数组

1)通过结构i体内int比较的话

#include<stdlib.h>
#include<string.h>
struct stu 
{
	int age;
	char name[20];
	int num;
}su[3];
int pt(const void* e1, const void* e2)
{
	return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
}
int main()
{
	struct stu su[3] = {{23,"xiaoli",12345} ,{18,"zhang",23456}, {34,"wang",34567}};
	qsort(su, sizeof(su) /sizeof(su[0]), sizeof(su[0]), pt);
	for (int a = 0; a < 3; a++)
	{
		printf("%d %s %d\n", su[a].age, su[a].name, su[a].num);
	}
	return 0;
}

2)通过结构体内char排序的话

#include<stdlib.h>
#include<string.h>
struct stu 
{
	int age;
	char name[20];
	int num;
}su[3];
int pt(const void* e1, const void* e2)
{
	return strcmp(((struct stu*)e1)->name ,((struct stu*)e2)->name);
}
int main()
{
	struct stu su[3] = {{23,"xiaoli",12345} ,{18,"zhang",23456}, {34,"wang",34567}};
	qsort(su, sizeof(su) /sizeof(su[0]), sizeof(su[0]), pt);
	for (int a = 0; a < 3; a++)
	{
		printf("%d %s %d\n", su[a].age, su[a].name, su[a].num);
	}
	return 0;
}

 通过上面例子就会发现,好像这个排序方式都是升序,那么怎么实现降序排序呢,很简单,我们只要把e1和e2俩个参数的前后互换一下就行,因为e1找到的数据是在数组的前面的数据,而e2找到的数据是数组后面的数据,我们在上面都是以e1-e2,最后排序的方式是升序,那如果交换一下前后呢,比如e2-e1,因为排序的方式是通过返回的值来决定的,所以互换一下前后不就可以实现降序了吗。比如:

#include<stdlib.h>
#include<string.h>
struct stu 
{
	int age;
	char name[20];
	int num;
}su[3];
int pt(const void* e1, const void* e2)
{
	return strcmp(((struct stu*)e2)->name ,((struct stu*)e1)->name);
}
int main()
{
	struct stu su[3] = {{23,"xiaoli",12345} ,{18,"zhang",23456}, {34,"wang",34567}};
	qsort(su, sizeof(su) /sizeof(su[0]), sizeof(su[0]), pt);
	for (int a = 0; a < 3; a++)
	{
		printf("%d %s %d\n", su[a].age, su[a].name, su[a].num);
	}
	return 0;
}

 

只用看中间e2和e1的位置就行。

那么关于qsort的内容如上,谢谢观赏。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值