C语言库函数— qsort () 详解

news2025/4/18 22:39:28

目录

1. qsort()函数简介

1.1 函数原型

1.2 函数参数 

2. 比较函数简介

2. 1 比较函数参数 

2.2 比较函数使用 

3. qsort()函数使用 

3.1 整形数组排序

 3.2 字符数组排序

3.3 浮点型数组排序(double类型为例)

3. 4 字符串数组排序 

3.5 结构体 


1. qsort()函数简介

qsort()函数是C语言库函数中的一种排序函数,排序方法为快速排序(quick sort 

其特点是可以排序任意类型的数组元素。

1.1 函数原型

void qsort(void* base, size_t num, size_t size, int (*comparator)(const void* elem1, const void* elem2));

需引用头文件:<stdlib.h><search.h>

1.2 函数参数 

qsort()函数需要四个参数

1. void* base:  需排序数组首元素

2. size_t num: 数组元素个数

3. size_t size: 一个数组元素大小(byte)

4. int (*comparator) (const void* elem1 , const void* elem2):  是一个函数指针,其指向的是一个比较函数的地址,该函数有两个void* 的参数,其返回类型为int 。

void* 类型指针:可以接收任意类型的地址,但不能进行解引用操作和不能对其进行加减整数的操作。

2. 比较函数简介

2. 1 比较函数参数 

比较函数为自定义函数:其两个参数为void*类型指针的elem1和elem2 ,返回参数为整形int

参数类型为void*原因:不清楚需比较元素的类型是什么,所以通过void*类型指针的特点(可以接收任意类型的地址)来接收。const修饰其两个比较参数不可被更改

返回值有三种情况: 

 < 0 : elem1 小于 elem2

 = 0 : elem1 等于 elem2

 > 0 : elem1 大于 elem2

2.2 比较函数使用 

如需使用比较函数而void*类型指针不能解引用操作和加减整数操作我们只需对两个元素进行强制类型转换为我们想比较元素的类型指针,再进行解引用获取两个元素的值,最后进行两个元素的差值返回

整型数组

int comp_int(const void* elem1, const void* elem2)
{
	return *(int*)elem1 - *(int*)elem2;
}

字符数组

int comp_char(const void* elem1, const void* elem2)
{
	return *(char*)elem1 - *(char*)elem2;//字符计算是计算ASCLL值
}

浮点型数组

int comp_double(const void* elem1, const void* elem2)
{
	return (int)(*(double*)elem1 - *(double*)elem2);
//浮点型差值为浮点型,而返回值需要为int型,避免报错将差值强制类型转换为int型
}

字符串

按首字母排序

int comp_char(const void* elem1, const void* elem2)
{
	return *(char*)elem1 - *(char*)elem2;//字符计算是计算ASCLL值
}

按字符串长度排序

int comp_string(const void* elem1, const void* elem2)
{
	if (strlen(*(char*)elem1) > strlen(*(char*)elem2))
	{
		return 1;
	}
	else if (strlen(*(char*)elem1) < strlen(*(char*)elem2))
	{
		return -1;
	}
	else
	{
		return 0;
	}
}

按正常排序

int comp_string(const void* elem1, const void* elem2)
{
	return strcmp(*(char*)elem1, *(char*)elem2);//strcmp比较两个字符串大小
}

结构体

struct stu
{
	char name[20];
	int grade;
};

对学生姓名排序

int comp_string(const void* elem1, const void* elem2)
{
	return strcmp(((str*)elem1)->name, ((str*)elem2)->name);
}

对学生成绩排序

int comp_string(const void* elem1, const void* elem2)
{
	return strcmp(((str*)elem1)->grade, ((str*)elem2)->grade);
}

3. qsort()函数使用 

3.1 整形数组排序

int cmp_int(const void* elem1, const void* elem2)
{
	return *(int*)elem1 - *(int*)elem2;
}
int main()
{
	int arr[] = { 2,4,6,8,10,1,3,5,9,7 };
	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 字符数组排序

int cmp_char(const void* elem1, const void* elem2)
{
	return *(char*)elem1 - *(char*)elem2;
}
int main()
{
	char ch[] = {'b','c','a','e','f','d','g'};
	int sz = sizeof(ch) / sizeof(ch[0]);
	int i = 0;
	qsort(ch, sz, sizeof(ch[0]), cmp_char);
	for (i = 0; i < sz; i++)
	{
		printf("%c ", ch[i]);
	}
	return 0;
}

3.3 浮点型数组排序(double类型为例)

int cmp_double(const void* elem1, const void* elem2)
{
	return (int)(*(double*)elem1 - *(double*)elem2);
}
int main()
{
	double arr[] = {2.5,1.0,3.5,4.5,2.0};
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	qsort(arr, sz, sizeof(arr[0]), cmp_double);
	for (i = 0; i < sz; i++)
	{
		printf("%f ", arr[i]);
	}
	return 0;
}

3. 4 字符串数组排序 

按字符串首字母排序

int cmp_string(const void* elem1, const void* elem2)
{
	return *(char*)elem1 - *(char*)elem2;
}
int main()
{
	char ch[5][10] = { "black","cat","apple","face","dog" };
	int sz = sizeof(ch) / sizeof(ch[0]);
	int i = 0;
	qsort(ch, sz, sizeof(ch[0]), cmp_string);
	for (i = 0; i < sz; i++)
	{
		printf("%s ", ch[i]);
	}
	return 0;
}

 按正常排序

int cmp_string(const void* elem1, const void* elem2)
{
	return strcmp((char*)elem1,(char*)elem2);
}
int main()
{
	char ch[5][10] = { "aaa","a","aaaaa","aa","aaaa" };
	int sz = sizeof(ch) / sizeof(ch[0]);
	int i = 0;
	qsort(ch, sz, sizeof(ch[0]), cmp_string);
	for (i = 0; i < sz; i++)
	{
		printf("%s ", ch[i]);
	}
	return 0;
}

3.5 结构体 

typedef struct Stu
{
	char name[20];
	int age;
}Stu;

int cmp_str(const void* elem1, const void* elem2)
{
	return strcmp(((Stu*)elem1)->name, ((Stu*)elem2)->name);
}

int main()
{
	Stu s[] = { {"张三",18},{"李四",19},{"王五",20} };
	int sz = sizeof(s) / sizeof(s[0]);
	int i = 0;
	qsort(s, sz, sizeof(s[0]), cmp_str);
	for (i = 0; i < sz; i++)
	{
		printf("%s %d\n", s[i].name, s[i].age);
	}
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/42704.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Security(十八)--OAuth2:实现授权服务器(上)--环境准备以及骨架代码搭建

一、前言 本节大家如果一直从一开始看过来的话&#xff0c;就会巧妙发现我们将之前的实践代码全部连接起来&#xff0c;本节将会使用到之前的短信/验证码登录相关的逻辑代码&#xff0c;如果大家没有看的感兴趣可以回到https://editor.csdn.net/md/?articleId127617691先将这…

【pdf翻译中文】免费自用日语pdf转中文、韩语pdf转中文(也可以转英文)或者其他小语种法语、德语pdf转中文

不是很精确、有点慢&#xff0c;但是也够用&#xff0c;胜在免费free 效果图&#xff1a; 一些对比&#xff1a; 模型来自于&#xff1a; https://huggingface.co/models 文件目录 调用模型的代码&#xff1a; 运行此段代码&#xff0c;执行翻译 一些简单的设置在这里…

【LeetCode每日一题】——557.反转字符串中的单词 III

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 字符串 二【题目难度】 简单 三【题目编号】 557.反转字符串中的单词 III 四【题目描述】 给…

DPU1.1S—高性能、低功耗4口高速USB2.0HUB控制器芯片

DPU1.1S是一款高性能、低功耗4口高速 USB2.0 HUB 控制器&#xff0c;上行端口兼容高速 480MHz和全速12MHz两种模式&#xff0c;4个下行端口兼容高速480MHz、全速12MHz、低速1.5MHz三种模式。 DPU1.1S采用状态机单事务处理架构&#xff0c;而非单片机架构&#xff0c;多个事务缓…

沃通CA证书支持多所高校招投标文件电子签名

招投标电子化是国家大力推行的战略性工作&#xff0c;为贯彻落实电子招投标工作&#xff0c;各政企单位、高校均启动采购与招投标系统&#xff0c;自行组织的招标、单一来源等采购活动都通过该类系统在线进行。近期&#xff0c;沃通CA证书打通与多所高校采购与招投标系统的应用…

C语言深度解析:函数的形参和实参与传值和传址(多角度分析,让你有一种相见恨晚的感觉!!!!)

目录 一、前言 二、函数的形参和实参 &#x1f351;实参 &#x1f34e;形参 &#x1f347;形参与实参之间的区别 &#x1f350;形参与实参之间的联系&#xff08;重点&#xff01;&#xff01;&#xff01;&#xff01;&#xff09; 三、函数的传值和传址&#xff08;超…

[附源码]计算机毕业设计JAVA网上宠物商店

[附源码]计算机毕业设计JAVA网上宠物商店 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis M…

【html5期末大作业】基于HTML仿QQ音乐官网网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Xcode 中设置APP的图标(Icon)和启动页面(Launch Screen)

设置图标&#xff08;Icon&#xff09; 首先&#xff0c;要准备4组图标&#xff08;如果是发布在 iOS 平台上&#xff09;&#xff0c;这4组分别是 120 x 120 px&#xff0c;152 x 152 px&#xff0c;167 x 167 px&#xff0c;1024 x 1024 px 的尺寸&#xff0c;要 PNG 格式。…

使用EL表达式时,PropertyNotFoundException异常的解决过程

一. 业务场景 最近&#xff0c;杨哥的一个班级正在做基于JSPJSTL/EL Servlet JavaBean JDBC MySQL技术方案的阶段项目。其中有一个需求是根据多条件动态搜索商品信息&#xff0c;最终分页显示出商品列表。这个功能可以在dao层采用多分支条件组合&#xff0c;显示页面使用JST…

2022王道OS 1.3 操作系统运行环境

2022王道OS 1.3 操作系统运行环境 文章目录2022王道OS 1.3 操作系统运行环境1.3_1 操作系统的运行机制知识总览知识点预备知识&#xff1a;程序是如何运行的&#xff1f;两种程序&#xff1a;内核程序 VS 应用程序两种指令&#xff1a;特权指令 VS 非特权指令两种状态&#xff…

二、【React脚手架】组件化编码(TodoList案例)

文章目录1、组件化编码流程&#xff08;通用&#xff09;2、样式覆盖问题3、DEMO3.1、需要实现的效果3.2、前期须知3.3、项目结构3.4、CODE3.4.1、App.js3.4.2、App.css3.4.3、Header3.4.4、List3.4.5、Item3.4.6、Footer1、组件化编码流程&#xff08;通用&#xff09; 拆分组…

Python 面向对象简介

什么是面向对象&#xff1f; 面向对象是一种编程思想&#xff0c;在开发过程中关注的不是解决问题的步骤和过程&#xff0c;而是参与解决问题的对象和它们具备的行为。 01 面向过程和面向对象的区别 1、面向过程 面向过程在开发过程中关注的是解决问题的步骤和过程&#xf…

《计算机体系结构量化研究方法第六版》1.6 成本趋势

1.6.1 时间、产量和大众化的影响 即便没有技术进步&#xff0c;计算机组件的制造成本也会随着时间的推移而降低。这背后有着学习曲线的因素。 【学习曲线&#xff08;from百度&#xff09;】 学习曲线的定义为"在一定时间内获得的技能或知识的速率"&#xff0c;又称…

2022王道OS 1.4 操作系统的体系结构 chap1回顾

2022王道OS 1.4 操作系统的体系结构 & chap1回顾 操作系统的体系结构 知识总览 操作系统的内核 时钟管理&#xff1a;利用时钟中断实现计时功能 原语&#xff1a;一种特殊的程序&#xff0c;具有原子性&#xff08;一气呵成&#xff0c;不可被中断&#xff09; 内核是操…

人工智能开启甲骨文整理研究新范式

编者按&#xff1a;在甲骨学研究中&#xff0c;甲骨“校重”整理是一项费事费力但又极其重要的基础性研究工作。微软亚洲研究院与首都师范大学甲骨文研究中心莫伯峰教授团队合作开发的甲骨文校重助手Diviner&#xff0c;第一次将自监督AI模型引入到甲骨文“校重”工作中&#x…

【Mysql】数据库的基本操作和表的基本操作

本章内容是,用sql语言实现对数据库的基本操作和表的基本操作 文章目录前言1. 数据库的基本操作1.1 创建数据库1.2 查看数据库1.3 选中数据库1.4 删除数据库2. 数据库基本数据类型3. 表的基本操作3.1 创建表3.2 显示数据库中的表3.3 查看表的构造3.4 删表4. 表的增删改查4.1 增加…

使用synchronized 加锁你加对了么?

本文讲解使用synchronized只是对synchronized的使用,底层原理将在后续文章 目录 从实际中理解共享带来的问题 Java代码实现共享带来的问题进行分析 临界区(Critical Section) 与 竞态条件(Race Condition) 临界区 竞态条件 synchronized解决方案 怎么理解synchronized中…

【web前端期末大作业】基于HTML+CSS+JavaScript实现代理商销售管理系统后台(8页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

mathtype在word内的简单使用

一、简单使用 1、快捷键 快捷键说明ctrlaltQ行内公式altshiftQ右编号&#xff08;行间公式&#xff09;\ ;{空格、大括号都需要转义ALTF4关闭mathtype窗口 2、小技巧 \left与\right 一定要配对使用&#xff0c;且对于对称的符号&#xff08;如(), {}等&#xff09;来说&…