qsort函数的使用方法

前言

qsort函数是C语言库函数内给我们提供的一个可以实现排序的函数
它不仅可以排序数组,还可以排序字符串,以及结构体类型
下面是qsort函数的使用方法以及注意事项


一、了解qsort函数

根据MSDN提供的参数在这里插入图片描述
由此我们可以知道 使用qsort函数需要引用头文件<stdlib.h>或者<search.h>
此外函数有四个形参,我们将其逐个分析
void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );

1.void *base:Start of target array
一个空类型的指针,用于接收数组的首地址,由于qsort的作者并不知道使用者要排序什么类型的数组,所以定义了void类型的指针,以至于能保证使用者在调用时,函数能够接下数组的首地址

2.size_t num:Array size in elements
数组内元素的个数 (size_t定义的是正数,因为数组内部的元素恒为正)

3.size_t width:Element size in bytes
数组内单个元素的字节大小,比如int类型的数组单个元素大小为4,char类型数组单个元素的大小为1

4.int (__cdecl *compare )(const void *elem1, const void *elem2 ):Comparison function
一个函数指针,指向的函数返回值为int,其形参为两个void类型的指针
该函数是由使用者提供的,用于比较数组中两个元素的大小,称为比较函数
在这里插入图片描述
由图
若elem1<elem2 该函数返回的值<0
若elem1>elem2 该函数返回的值>0
若elem1=elem2 该函数返回的值=0

二、使用方法

如果我们想要使用qsort函数,引用头文件还有调用qsort函数是必不可缺的
除此之外,使用者还需要根据自己需要比较的数组类型,提供一个比较函数
我们以int类型的数组为例

void text1()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);//此处调用了qsort函数,提供了数组首地址,数组的元素个数,单个元素的字节大小,以及需要提供给qsort函数的比较函数
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

此外我们还需要编写提供给qsort函数的比较函数

int cmp_int(const void* p1, const void* p2)
{
	return *(int*)p1 - *(int*)p2;
}

由于形参p1和形参p2的类型为void*,此类型的指针能接受任何类型的指针,但不能通过解引用操作符* 来访问地址背后的数据,所以使用者要根据实际的类型进行强制类型转换之后才能使用解引用操作符访问背后的数据进行比较,如上图中我们将形参p1和p2强制类型转换为int*类型的指针,将p1-p2的值返回给qsort,qsort用于判断是否要进行交换元素
备注(如果我们要将元素升序排列 返回值应该为p1-p2,同理如果我们需要降序,则返回值为p2-p1)

当我们要比较字符串的大小时,我们通常用strcmp函数进行比较
根据MSDN提供的参数
在这里插入图片描述
strcmp提供的返回值恰好和qsort调用比较函数需要的返回值相同
即在提供比较字符串qsort需要的函数时 我们可以返回调用strcmp函数返回的值

int cmp_char(const void* p1, const void* p2)
{
	return strcmp((char*)p1,(char*)p2);
}

而在访问结构体类型时候我们需要将p1和p2转化成对应的结构体指针

int cmp_struct_age(const void* p1, const void* p2)
{
	return ((struct Str*)p1)->age - ((struct Str*)p2)->age;
}

以上就是qsort的使用方法,希望能够帮助到你!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值