深入浅出理解 C 语言中的 qsort 函数

目录

引言

一、什么是qsort

二、函数原型 

1.qsort函数

 2.比较函数

三、qsort函数使用示例

1.使用qsort排序整形数据

 2.使用qsort排序结构数据

总结 


引言

在编程中,排序是一个常见且重要的操作。C 语言标准库提供了一系列排序函数,其中 qsort 函数是一个非常强大的工具。本文将深入浅出地介绍 qsort 函数的用法、原理,并通过实例展示如何在实际编程中使用它。

一、什么是qsort

qsort 是 C 标准库 <stdlib.h> 中提供的一个排序函数。它使用快速排序算法(Quick Sort)对数组进行排序。快速排序是一种高效的排序算法,由 Tony Hoare 在 1960 年发明,其平均时间复杂度为 O(n log n)。

 

二、函数原型 

1.qsort函数

qsort 函数原型

void qsort(void *base, size_t num, size_t size,int (*compar)(const void *, const void *));

下面是 qsort 函数的参数说明

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

 2.比较函数

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

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

比较函数的原型如下:

int compar(const void *a, const void *b);

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

负值,如果参数 a 小于参数 b;
,如果参数 a 和 b 相等;
正值,如果参数 a 大于参数 b。

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

int int_cmp(const void *a, const void *b);//写一个比较两个整数的函数为例
return (*( int *)p1 - *(int *) p2);//p1、p2强制类型转化成int*再解引用然后做差

三、qsort函数使用示例

1.使用qsort排序整形数据

#include <stdio.h>
//qosrt函数的使⽤者得实现⼀个⽐较函数
int int_cmp(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 i = 0;qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){printf("%d ", arr[i]);}printf("\n");return 0;
}

运行结果如下:

 2.使用qsort排序结构数据

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
typedef struct Stu //学⽣ 
{char name[20];//名字int age;//年龄 
}Student;//typedef重定义类型名,Student就是这个结构体类型的别名
//假设按照年龄来⽐较--整形比较
int cmp_stu_by_age(const void* e1, const void* e2)
{return ((Student*)e1)->age - ((Student*)e2)->age;
}
//假设按照名字来⽐较--字符串比较
int cmp_stu_by_name(const void* e1, const void* e2)
{return strcmp(((Student*)e1)->name, ((Student*)e2)->name);
}//strcmp是库函数,是专⻔⽤来⽐较两个字符串的比较大小(按字符串对应的字符的ASCII码进行比较)
//按照年龄来排序
void test_age(Student* s,int sz)//参数为结构体数组指针,数组长度
{qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);// 打印排序后的结构体数组printf("\n按年龄排序\n");for (int i = 0; i < sz; i++) {printf("%s is %d years old.\n", s[i].name, s[i].age);}
}
//按照名字来排序
void test_name(Student*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()
{Student s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };int sz = sizeof(s) / sizeof(s[0]);test_age(s,sz);test_name(s,sz);return 0;
}

运行结果如下:

总结 

qsort 是 C 语言中一个强大且灵活的排序工具。通过提供自定义的比较函数,我们可以对各种数据类型的数组进行排序。掌握 qsort 的用法,可以让我们的编程工作更加高效。希望本文能够帮助你更好地理解和运用 qsort 函数。

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

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

相关文章

华为IoTDA解码插件报告错误:The decoding result is empty.data

前面的博文讲过&#xff0c;在使用Neuron上传数据到华为IoTDA的时候没有使用华为的物模型进行解析&#xff0c;因为两者的数据格式不同。具体的说Neuron上传的格式是 {"node": "RS485", "group": "Data", "timestamp": 172…

CSS画边框线带有渐变线和流光边框实例

流光边框css流光边框动画效果_哔哩哔哩_bilibili流光边框css流光边框动画效果_哔哩哔哩_bilibili纯CSS写一个动态流水灯边框的效果&#xff5e;_哔哩哔哩_bilibili荧光边框CSS 动画发光渐变边框特效_哔哩哔哩_bilibili [data-v-25d37a3a] .flow-dialog-custom {background-col…

xhs全参

声明 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 目标网站 aHR0cHM6Ly93d…

【线性代数】矩阵变换

一些特殊的矩阵 一&#xff0c;对角矩阵 1&#xff0c;什么是对角矩阵 表示将矩阵进行伸缩&#xff08;反射&#xff09;变换&#xff0c;仅沿坐标轴方向伸缩&#xff08;反射&#xff09;变换。 2&#xff0c;对角矩阵可分解为多个F1矩阵&#xff0c;如下&#xff1a; 二&a…

【浅谈具身智能(Embodied AI)】AI新风口?

具身智能 概念: 具身智能&#xff08;Embodied AI&#xff09;是一种基于物理身体进行感知和行动的智能系统。它通过智能体与环境的交互获取信息、理解问题、做出决策并实现行动&#xff0c;从而产生智能行为和适应性。具身智能拥有支持感知和运动的物理身体&#xff0c;可以…

.NET C# 配置 Options

.NET C# 配置 Options 使用 options 模式可以带来许多好处&#xff0c;包括清晰的配置管理、类型安全、易于测试和灵活性。但在使用过程中&#xff0c;也需要注意配置复杂性、性能开销和依赖框架等问题。通过合理设计和使用&#xff0c;可以充分发挥 options 模式的优势&#…

设计模式实战:库存管理系统的设计与实现

简介 本篇文章将介绍如何设计一个库存管理系统,系统包括商品的创建、库存操作(如入库、出库)、库存检查等功能。我们将通过这一项目,应用工厂模式、策略模式和模板方法模式来解决具体的设计问题。 问题描述 设计一个库存管理系统,用户可以创建商品,进行入库和出库操作…

Vue.js 2 项目实战(五):水果购物车

前言 Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架。它的设计目标是通过采用易于上手的结构和强大的功能&#xff0c;使前端开发变得更加简便和高效。以下是 Vue.js 的一些关键特性和优点&#xff1a; 核心特性 声明式渲染 Vue.js 使用声明式语法来描述用户界面&a…

MybatisPlus的使用与详细讲解

今天我们来讲解一下Mybatis的升级版&#xff0c;就是MybatisPlus. MybatisPlus是如何获取实现CRUD的数据库表信息的&#xff1f; 默认以类名驼峰转下划线作为表名 默认把名为id的字段作为主键 默认把变量名驼峰转下划线作为表的字段名 1.MybatisPlus中比较常见的注解 TableN…

宠物空气净化器哪款除臭效果好?质量好的养狗空气净化器排名

作为一个宠物家电小博主&#xff0c;炎炎夏日&#xff0c;家中的宠物给你带来的不仅仅是温暖的陪伴&#xff0c;还有那挥之不去的宠物异味。普通空气净化器虽然能够应对一般的空气净化需求&#xff0c;但对于养猫家庭特有的挑战&#xff0c;如宠物毛发、皮屑和异味等&#xff0…

mysql中的索引和分区

目录 1.编写目的 2.索引 2.1 创建方法 2.2 最佳适用 2.3 索引相关语句 3.分区 3.1 创建方法 3.2 最佳适用 Welcome to Code Blocks blog 本篇文章主要介绍了 [Mysql中的分区和索引] ❤博主广交技术好友&#xff0c;喜欢文章的可以关注一下❤ 1.编写目的 在MySQL中&…

ros2--接口

什么是接口 这里的接口不是编程语言中的函数接口。而是应该理解为在ros2中进行数据通信的接口&#xff1b;这些接口在ros2中使用时必须有统一的标准&#xff0c;就像陷淖USB接口一样有着统一的通信协议。所以这里的接口更好的理解是&#xff1a;ros2数据通信的统一接口。 我们…

JAVA中的输入输出流

FileInputStream、FileOutputStream&#xff08;字节流&#xff09; 字节输入流InputStream主要方法&#xff1a; read() &#xff1a;从此输入流中读取一个数据字节。 read(byte[] b) &#xff1a;从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。 read(b…

单例模式懒汉模式和饿汉模式

线程安全 单例模式在单线程中&#xff0c;当然是安全的。但是如果在多线程中&#xff0c;由于并行判断&#xff0c;可能会导致创建多个实例。那么如何保证在多线程中单例还是只有一个实例呢? 常见的三种方式: 局部静态变量 原理和饿汉模式相似&#xff0c;利用static只会初始…

cURL自动读取小工具

做自动化测试的时候Postman判断数据什么的太麻烦&#xff0c;做个脚本代替一下 curl_parser.py import redef parse_curl(curl_command):# 匹配所有的 -H "key: value"header_pattern re.compile(r-H "([^:]): ([^"])")headers dict(header_patte…

Redis系列命令更新--Redis有序集合命令

Redis有序集合&#xff08;sorted set&#xff09; &#xff08;1&#xff09;说明&#xff1a; A、Redis有序集合和集合一样也是string类型元素的集合&#xff0c;且不允许重复的成员&#xff1b;不同的是每个元素都会关联一个double类型的分数&#xff1b;redis正式通过分数…

Web开发:元素

元素 基础结构元素文本内容元素列表元素多媒体元素表格元素表单元素语义元素示例结构分析基础结构元素头部和导航主页部分关于部分服务部分联系部分侧边栏页脚 基础结构元素 <!DOCTYPE html>&#xff1a;声明文档类型&#xff0c;告诉浏览器使用HTML5标准解析文档。它必…

MongoDB 文档存储

安装 下载&#xff1a; Download MongoDB Community Server | MongoDB 说明&#xff1a; 现在基本都安装的是4.4以后的版本。安装完成后使用 mongod 来查看是否安装成功 会输出一堆内容 而如果想要操作数据库&#xff0c;则需要安装一个工具&#xff0c;mongosh-2.2.12-x64.m…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 堆内存申请(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

linux(CentOS、Ubuntu)安装python3.12.2环境

1.下载官网Python安装包 wget https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tar.xz 1.1解压 tar -xf Python-3.12.2.tar.xz 解压完后切换到Python-3.12.2文件夹(这里根据自己解压的文件夹路径) cd /usr/packages/Python-3.12.2/ 1.2升级软件包管理器 CentOS系…