【C语言】qsort函数的介绍和使用

0. 引言

我们日常生活中经常能碰到需要给一组数据排序 的情况,如将班上同学的身高,年龄从大到小排序,平时网上购物时对商品价格从低到高排序等等场景,那么电脑是根据什么程序完成这些排序的?接下来就来给大家介绍一下C语言中, 可以实现排序 的库函数 --- qsort。

1. qsort 是什么?

qsort 是 C语言 标准库 <stdlib.h> 中提供的一个排序函数。

它使用的是快速排序算法(Quick Sort)对数组进行排序。

参考链接:qsort - C++ Reference (cplusplus.com)

2、qsort 函数介绍

2.1 qsort 函数原型

cpp 复制代码
void qsort(void *base, size_t num, size_t size,
           int (*compar)( const void *, const void * ));

下面是 qsort 函数的参数说明:

base :指向待排数组的第一个元素的指针。
num :base指向的待排数组中元素的个数。
size :base指向的待排数组中每个元素的大小,以字节为单位。
compar:函数指针,指向的就是两个元素的比较函数,该函数用于确定排序的顺序。

2.2 compar 比较函数

相信同学们对于qsort函数第四个参数是函数指针不是很了解,在这里给大家详细说说~

qsort 函数使用了一个回调函数。回调函数是什么呢?在计算机编程中,回调函数是一种作为参数传递给另一个函数的函数,以便在某个特定事件发生时由该函数调用。在 qsort 的上下文中,回调函数用于确定数组中元素的比较方式。

在 qsort 的定义中,int (*compar)(const void *, const void *) 是一个函数指针参数,它指向了一个compar 这样一个比较函数。当 qsort 需要比较数组中的两个元素时,它会调用这个比较函数。比较函数的返回值决定了 qsort 如何重新排列数组中的元素。

比较函数的原型如下:

cpp 复制代码
int compar(const void* p1, const void* p2);

这个比较函数需要返回以下三个值之一:

其实意思是:

如果p1指向的内容小于p2小于指向的内容,则返回<0的数字;

如果p1指向的内容等于p2小于指向的内容,则返回=0的数字;

如果p1指向的内容大于p2小于指向的内容,则返回>0的数字

所以一般比较函数都这样写,比如这里以一个比较两个整形的函数的话:

cpp 复制代码
int cmp_int(const void* p1, const void* p2);
//p1、p2强制类型转化成int*再解引用然后作差,它的值和0比较
return (*( int *)p1 - *(int *) p2);

3. qsort函数使用示例

3.1 使用qsort排序整形数据

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

//qsort函数的使⽤者得实现⼀个⽐较函数
int cmp_int (const void* p1, const void* p2)
{
	return (*(int*)p1 - *(int*)p2);
}

int main()
{
	int arr[] = { 9,7,5,3,1,8,6,4,2,0 };
    int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
 
	qsort(arr, sz, sizeof(arr[0]), cmp_int);

	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}

运行结果如下:

3.2 使用qsort排序结构数据

cpp 复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


//定义一个学⽣的结构体类型
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);
}//strcmp是库函数,是专⻔⽤来⽐较两个字符串的比较大小(按字符串对应的字符的ASCII码进行比较)

 //按照年龄来排序
void test_age(struct Stu* s, int sz)//参数为结构体数组指针,数组长度
{
	qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
	// 打印排序后的结构体数组
	printf("按年龄排序:\n");
	for (int i = 0; i < sz; i++)
	{
		printf("%s is %d years old.\n", s[i].name, s[i].age);
	}
}

//按照名字来排序
void test_name(struct Stu* s, int sz)//参数为结构体数组指针,数组长度
{
	qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
	// 打印排序后的结构体数组
	printf("\n按名字排序:\n");
	for (int i = 0; i < sz; i++)
	{
		printf("%s is %d years old.\n", s[i].name, s[i].age);
	}
}

int main()
{
	struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };
	int sz = sizeof(s) / sizeof(s[0]);
	test_age(s, sz);
	test_name(s, sz);
	return 0;
}

运行结果如下:

4. 总结

qsort 是 C 语言中一个强大且灵活的排序库函数。通过提供自定义的比较函数,我们可以对各种数据类型的数组进行排序。掌握 qsort 的用法,可以让我们的编程工作更加高效。

希望本文能够帮助你更好地理解和运用 qsort 函数。

相关推荐
Sarvartha4 分钟前
Object 类
java·开发语言
j7~18 分钟前
【C++ 标准项目】发布订阅消息队列 (篇七):项目创建与基础工具模块搭建
开发语言·c++·log4j·uuid·protobuf·helper工具·消息定义类型和交换机类型定义
leisoo809722 分钟前
股票筹码分布怎么用获利比例成本区间与集中度实战 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·开源
Lazionr34 分钟前
unordered_map和unordered_set的使用
开发语言·c++·算法
Xiu Yan1 小时前
Python 数据分析:数据分析步骤
开发语言·python·数据分析
黑妹天下第一乖1 小时前
小智改造实战解读-用kokoro-onnx替换云端 TTS 的完整记录
大数据·开发语言·人工智能·python·交互
郑州光合科技余经理1 小时前
本地生活平台搭建:跨业态用户标识怎么贯通
java·开发语言·前端·后端·uni-app·php·ai编程
深盾科技_Virbox1 小时前
云端与本地并行交付,软件许可管理如何实现统一运营?
java·大数据·开发语言·安全
xuxigifxfh2 小时前
HJ15 求int型正整数在内存中存储时1的个数
java·开发语言·华为机考
Wokoo72 小时前
自动化测试入门:核心场景、回归测试与 Web 自动化环境搭建
java·开发语言·测试工具