qsort函数的使用——C语言

什么是qsort

我们在cplusplus官网可以查找到关于qsort函数的信息
在这里插入图片描述
这些只是qsort函数的大概信息。具体信息我们用一个例子来慢慢讲解。

使用qsort给一个整型数组排序

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int arr[10] = { 2,5,0,1,3,6,7,9,8,4 };

	return 0;
}

现在有如下数组arr,我们接下来使用qsort函数对其排序。

#include <stdio.h>
#include <stdlib.h>
int cmp_int(const void* e1, const void* e2)
{
	return ((*(int*)e1) - (*(int*)e2));
}
int main()
{
	int arr[10] = { 2,5,0,1,3,6,7,9,8,4 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

程序运行结果:
在这里插入图片描述

接下来请让我讲解一下使用的原理。
在这里插入图片描述
其中需要主要讲解的就是第四个参数,请重新看一个该函数的官网介绍:
在这里插入图片描述
我来简单总结一下这段的内容。
我们需要给qsort函数提供一个比较数组内容大小的函数,返回类型为int,如果p1>p2则返回一个大于0的整数,p1<p2则返回一个小于0的整数,两者相等则返回0。了解完这些,我们还剩最后一个问题,这个compar函数的形参是两个void*类型,所以我们在使用之前需要进行强制类型转换,接下来请看例子:
在这里插入图片描述
以上代码经过优化后可以得到一下代码:

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

注意:
这段代码实现的功能是将arr数组升序排序,如果需要进行降序排序,只需将e1,e2更换一下位置即可。

经过以上讲解,我们应该对qsort的使用有了大概的了解了吧。
接下来我们再举一个例子,将三个结构体类型的数据按照姓名排序。
请看代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//定义结构体book
struct book
{
	char name[10];
	int price;
};
//判断字符串的大小
int cmp_str(const void* e1, const void* e2)
{
	return strcmp((*(struct book*)e1).name, (*(struct book*)e2).name);
}
//打印结构体内容
void show_b(struct book b[], int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%s\n", b[i].name);
	}
}
//测试qsort对结构体的排序
void test2()
{
	struct book b[3] = { {"sanmao",50},{"cpluse",30},{"game",60} };
	int sz = sizeof(b) / sizeof(b[0]);
	qsort(b, sz, sizeof(b[0]), cmp_str);
	show_b(b, sz);
}
int main()
{
	test2();
	return 0;
}

程序运行结果:
在这里插入图片描述

总结

qsort库函数是一个功能比较强大的函数,它可以排序任意内容的数组。使用该函数需要对指针,函数指针,回调函数有一些了解。qsort内部的实现是使用的快速排序的思想。我们下一期会讲解一下如何使用冒泡排序的思想,自实现qsort函数。
如果本篇博客有出错的地方的话希望大家在评论区指出,大家一起讨论,一起进步!
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值