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

2023-11-11

目录

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;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言库函数— qsort () 详解 的相关文章

  • MATLAB 检验数据正态分布及代码实现

    上篇简要介绍了正态分布检测的必要性和主要分析方法 此篇主要介绍如何通过MATLAB判断分析数据正态特性 1 主要方法 MATLAB检测数据正态特性主要通过数值测定和图形分析 其中数值测定指通过JB等假设检验方法进行测定分析数据 图形分析方法
  • 如何根据数组创建二叉树和打印二叉树?

    By Long Luo 之前的 如何根据数组或者字符串创建链表 http www longluo me blog 2020 12 10 Construct A LinkedList From An Array Or String 详述了 L
  • JS_一维数组转对象

    如果您想将一个一维数组转换为一个对象 可以使用 JavaScript 中的 Object fromEntries 方法 该方法接收一个键值对数组作为参数 并返回一个对象 其中每个键值对对应一个对象属性 const arr name John

随机推荐

  • 超详细手把手教你部署全分布模式Hadoop集群

    1 Hadoop 集群部署规划 全分布模式下部署 Hadoop 集群时 最低需要两台机器 一个主节点和一个从节点 本书拟将 Hadoop 集群运行在 Linux 上 将使用三台安装有 Linux 操作系统的机器 主机名分别为 hadoop
  • The JAVA_HOME environment variable is not defined correctly This environment variable is needed to r

    win10配置MAVEN HOME报错 cmd 中输入mvn v 会报错 The JAVA HOME environment variable is not defined correctly This environment variab
  • CGAL 使用PCA计算点云法向量

    目录 一 算法原理 1 主要函数 二 代码实现 一 算法原理 见 PCL 计算点云法向量并显示 1 主要函数 头文件 include
  • 在CentOS7上面搭建GitLab服务器

    首先要在CentOS系统上面安装所需的依赖 ssh 防火墙 postfix 用于邮件通知 wegt 以下这些命令也会打开系统防火墙中的HTTP和SSH端口访问 1 安装SSH协议 安装命令 sudo yum install y curl p
  • Git 通过change push代码时,失败 提示没有找到change-id

    提示错误如下 没有找到change id 导致不能push成功 那么如何解决该问题呢 解决方案如下 首先通过git reset mixed 71d4 版本号 回退commit 操作 问题来了 版本号如何获取呢 如下操作 在idea 上的gi
  • ubantu22安装配置VS Code(图文教程)

    平台 uabntu22 文件版本 code 1 74 2 1671533413 amd64 deb VSCode下载链接 Download Visual Studio Code Mac Linux Windowshttps code vis
  • android项目开发难点_APP应用开发中的三大难点

    虽然许多开发人员将移动应用程序作为业余爱好 但企业将移动应用程序视为其品牌战略的绝对重要方面 谁可以责怪公司利用移动性和营销趋势 但是 这给移动应用程序开发人员和测试人员带来了很大的压力 问题是移动应用程序开发并不容易 它需要相同的时间 精
  • MFC 播放视频 FFMPEG SDL

    使用MFC播放RTSP视频流 采用vlc的sdk有延时 使用FFMPEG SDL机制会好很多 本文总结了网络上的 只需四行代码即可简单实现SDL嵌入MFC播放视频和图片 和 100行代码实现最简单的基于FFMPEG SDL的视频播放器 先向
  • STM32 工作流程

    工作流程 上电后 芯片复位启动 MCU通过指令 数据总线从FLASH中读取指令或数据 配合解析执行 然后再通过RAM和通用寄存器 R0 R12的内部寄存器 处理可变数据 根据执行的指令 配置和操作外设的寄存器 从而驱动对应的外设实现具体的功
  • vue3.2从0-1封装一个组件库 ( 组件项目的创建 - 发布npm - 使用组件库 )

    目录 vue3 2从0 1封装一个组件库 1 组件的项目初建 1 1创建项目 1 2 packages button index js 1 3 packages button index vue 1 4 packages index js
  • 最详细的——C#对MySQL数据库数据的增删改查

    提示 建议将所有关于处理数据库数据的方法都封装在一个类里面 之后要相应的操作直接调用就可以了 文章目录 前言 一 创建yyl mysql类 自定义类名 二 主窗体样式 三 增 1 添加窗体 2 添加按钮绑定事件 3 运行效果 四 删 1 删
  • CSS自适应

    CSS一列的自适应
  • Fuch混沌映射

    一 Fuch混沌映射 Fuch混沌映射公式如下 该映射具有对初值不敏感 遍历均衡和收敛较快等优点 且在初值不为0的情形下均能产生混沌 二 Fuch混沌映射代码 x 1 rand for i 2 2000 x i cos 1 x i 1 2
  • Java实现符号函数功能

    Java实现符号函数功能 符号函数 Sign Function 又称为符号判断函数 是一种常见的数学函数 用于判断一个数的正负性 如果输入的数大于0 则返回1 如果输入的数等于0 则返回0 如果输入的数小于0 则返回 1 在Java中 我们
  • 大数据~几个入选的技术框架对比

    技术 特点 使用场景 对比 备注 Maxwell 轻量级数据同步中间件 支持刷全量 断点还原 随机读数据 固定JSON数据格式 mysql数据全量 增量同步 Canal 数据落地需要定制开发 不支持刷全量 虽然高版本有了adapter客户端
  • 华为swot分析2020_2020年全球与中国人工智能与分析系统行业现状及未来5年市场预测分析报告...

    本文研究全球及中国市场人工智能与分析系统现状及未来发展趋势 侧重分析全球及中国市场的主要企业 同时对比北美 欧洲 日本 中国 东南亚 印度等地区的现状及未来发展趋势 2019年全球人工智能与分析系统市场规模达到了xx亿元 预计2026年将达
  • springboot添加验证码功能

    开源验证码 1 Happy Captcha 提供了图片和动画两种展现形式 验证码内容包括中文 数字 09 中文数字 零至九 中文大写数字 零至玖 数字与字母混合 09 az AZ 数字与小写字母混合 09 az 数字与大写字母混合 09 A
  • Clang 中 AST 相关类简介(不定时更新)

    Clang 中 AST 相关类简介 不定时更新 1 Decl declaration 1 1 FunctionDecl 2 Stmt statement 3 Expr expression 3 1 FullExpr 3 2 ExprWith
  • 【Grub2】BIOS添加Grub2引导(Windows下操作)

    电脑上安装的系统是Windows10 BIOS MBR 想利用Grub2安装CentOS 和RemixOS三个操作系统 为了实现硬盘安装CentOS 需要用到Grub2 第一步 Grub2下载 文件准备到Grub2官网ftp ftp gnu
  • C语言库函数— qsort () 详解

    目录 1 qsort 函数简介 1 1 函数原型 1 2 函数参数 2 比较函数简介 2 1 比较函数参数 2 2 比较函数使用 3 qsort 函数使用 3 1 整形数组排序 3 2 字符数组排序 3 3 浮点型数组排序 double类型