当前位置: 首页 > news >正文

qsort函数详解+代码展示

文章目录

    • 概要
    • 系列文章目录
    • 前言
      • (1) 定义
      • (2) 使用(举例子 上代码)
        • 1、定义数组:
        • 2、定义比较函数:
        • 3、调用 qsort:
        • 4、输出结果:
      • (3) 注意事项
    • 小结

概要

本篇博客将详细地介绍qsort排序函数,(C语言中内置的库函数)
qsort排序函数可以排序任意的数据类型,
如:整型(int)、结构体(struct)、浮点型(float)……
只要你写出比较函数,并将比较函数的地址传递给qsort函数的第四个参数-- 函数指针(int(*cmp)(void*e1,void* e2)

系列文章目录

🎈 🎈 我的CSDN主页:OTWOL的主页,欢迎!!!👋🏼👋🏼
🎉🎉我的C语言初阶合集:C语言初阶合集,希望能帮到你!!!😍 😍
🔍🔍我的C语言进阶合集:我的C语言进阶合集,期待你的点击!!!🌈🌈

👋🏼🎉🎊创作不易,欢迎大家留言、点赞加收藏!!! 🥳😁😍

前言

qsort 是 C 语言标准库中的一个通用排序函数,
定义在 <stdlib.h> 头文件中。
它能够对任意类型的数组进行排序,只要提供适当的比较函数。
下面我将从定义、使用和注意事项三个方面详细讲解 qsort函数。

(1) 定义

  • qsort 函数的原型如下:
void qsort(void* base, size_t num, size_t size, int (*compar)(const void *, const void *));

void *base:指向要排序的数组的起始地址。
size_t num:数组中元素的个数。
size_t size:数组中每个元素的大小(以 字节 为单位)。
int (*compar)(const void *, const void *):指向一个比较函数的指针,该函数用于确定两个元素的排序顺序。


  • 比较函数

比较函数是一个用户定义的函数,它决定了排序的顺序。

比较函数的原型如下:

int compare(const void *e1, const void *e2);

const void *e1const void *e2:指向要比较的两个元素的指针。

  • 比较函数的返回值:

1、如果返回值小于 0,则 a 会被排在 b 前面。

2、如果返回值等于 0,则 a 和 b 的相对位置不变(但具体实现可能不同,有的实现会交换它们的位置)。

3、如果返回值大于 0,则 a 会被排在 b 后面。

(2) 使用(举例子 上代码)

  • 假设我们有一个整数数组,并希望使用 qsort 对其进行排序(升序)。以下是具体的步骤:
1、定义数组:
//定义一个整型的一维数组 arr,里面存放着 9,8,7,6,5,4,3,2,1,0 
// 一共有 10 个元素
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
2、定义比较函数:
//定义一个比较函数
int cmp_int(const void* e1, const void* e2)
{return (*(int*)e1) - (*(int*)e2);
}
3、调用 qsort:
//调用 qsort 排序函数
qsort(arr, sz, sizeof(arr[0]), cmp_int);
4、输出结果:

写在一个 test.c 的源代码中:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>//定义一个比较函数
int cmp_int(const void* e1, const void* e2)
{//返回 e1 和 e2 指针所指向的元素的 差值return (*(int*)e1) - (*(int*)e2);
}//定义一个输出打印的函数
void Print(int arr[], int sz)
{int i = 0;//输出for (i = 0; i < sz; i++){printf("%d ", arr[i]);}//换行printf("\n");
}void test1()
{//定义一个整型的一维数组 arr,里面存放着 9,8,7,6,5,4,3,2,1,0 // 一共 10 个元素int arr[] = { 9,8,7,6,5,4,3,2,1,0 };//求数组的大小int sz = sizeof(arr) / sizeof(arr[0]);//打印提示信息printf("排序前:\n");//调用函数 - 输出Print(arr, sz);//调用 qsort 排序函数(升序)qsort(arr, sz, sizeof(arr[0]), cmp_int);//打印提示信息printf("排序后:\n");//调用函数 - 输出Print(arr, sz);
}int main()
{//调用函数test1();return 0;
}
  • 输出结果:

(3) 注意事项

1、类型转换:

在比较函数中,需要将 void* 类型的指针转换为适当的类型(如 int*),然后 解引用 以获取实际的值。

2、数组边界:

确保传递给 qsort 的数组大小和每个元素的大小是正确的。

3、稳定性:

qsort 不保证排序的稳定性(即,如果两个元素相等,它们在排序后的相对位置可能会改变)。
如果需要稳定排序,可能需要使用其他算法或库。

4、性能:

qsort 通常使用快速排序算法,平均时间复杂度为 O(n log n)
但在最坏情况下(如数组已经有序或完全逆序)时间复杂度为 O(n^2)

5、线程安全:

在多线程环境中使用 qsort 时,需要确保传递给它的数组和比较函数在排序过程中不会被其他线程修改。

6、内存管理:

qsort 不会分配或释放内存,它只会在提供的数组上进行排序。

小结

熟练掌握qsort 函数的使用,可以让你在排序任意的数据类型,做到事半功倍,
因为,你只要将比较函数写好就行,其他的C语言库会帮你解决的!
但是也要注意使用时的注意事项哦!
如:函数的传参的类型,指针的强制类型转换等。

每天都在学习的路上!
On The Way Of Learning

相关文章:

qsort函数详解+代码展示

文章目录 概要系列文章目录前言(1) 定义(2) 使用&#xff08;举例子 上代码&#xff09;1、定义数组&#xff1a;2、定义比较函数&#xff1a;3、调用 qsort&#xff1a;4、输出结果&#xff1a; (3) 注意事项 小结 概要 本篇博客将详细地介绍qsort排序函数&#xff0c;&#x…...

leetcode hot100【LeetCode 136. 只出现一次的数字】java实现

LeetCode 136. 只出现一次的数字 题目描述 给定一个非空整数数组&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 …...

(免费送源码)计算机毕业设计原创定制:Java+ssm+JSP+Ajax SSM棕榈校园论坛的开发

摘要 随着计算机科学技术的高速发展,计算机成了人们日常生活的必需品&#xff0c;从而也带动了一系列与此相关产业&#xff0c;是人们的生活发生了翻天覆地的变化&#xff0c;而网络化的出现也在改变着人们传统的生活方式&#xff0c;包括工作&#xff0c;学习&#xff0c;社交…...

对抗攻击算法:FGSM和PGD

FGSM 传送门 FGSM 利用了梯度上升的思想&#xff0c;通过损失函数相对于输入图像的梯度来找到 最容易 迷惑网络的方向&#xff0c;并沿着这个方向对图像进行微小的扰动。 FGSM 的基本想法是&#xff0c;沿着这个梯度的符号方向对图像进行微调&#xff0c;以最大化损失函数。具…...

【八股文】小米

文章目录 一、vector 和 list 的区别&#xff1f;二、include 双引号和尖括号的区别&#xff1f;三、set 的底层数据结构&#xff1f;四、set 和 multiset 的区别&#xff1f;五、map 和 unordered_map 的区别&#xff1f;六、虚函数和纯虚函数的区别&#xff1f;七、extern C …...

xtu oj 众数

样例输入# 3 1 0 1 2 1 1 2 3 1 1 2 2样例输出# 1 2 3 解题思路&#xff1a;与数组大小有关&#xff0c;先排序 举个例子思考一下 n4 k2 数组为1 2 3 4 如果我们想让众数那个位的值为3(即max3)&#xff0c;3出现的次数为3&#xff0c;即众数为3&#xff0c;需要修改多少次…...

ENVI计算ROI分离度为灰色compute roi separability

我们在使用ENVI做影像分类的时候&#xff0c;需要采集样本兴趣区&#xff08;ROI&#xff09;&#xff0c;在采集完兴趣区需要计算样本ROI的分离度。 但是有时会发下你 计算ROI分离度的选项为灰色状态不能计算。 如果不是以下问题&#xff1a; “一个是必须首先选择或创建至少…...

Adaboost集成学习 | Python实现基于NuSVR-Adaboost多输入单输出回归预测

目录 效果一览基本介绍程序设计参考资料效果一览 基本介绍 基于NuSVR-Adaboost多输入单输出回归预测python代码 NuSVR是一种支持向量回归(SVR)算法的变体,用于解决回归问题。SVR是一种监督学习方法,它用于预测连续目标变量,而不是分类标签。NuSVR在SVR的基础上引入了一个…...

Python学习第十三天--面向对象,类和对象

一、面向过程和面向对象区别 面向过程&#xff1a;需要实现一个功能时&#xff0c;着重的是开发的步骤和过程&#xff0c;每个步都需要自己亲力亲为&#xff0c;需要编写代码&#xff08;自己来做&#xff09; 面向对象&#xff1a;需要实现一个功能时&#xff0c;不注重的是…...

AI运用落地思考:如何用AI进行系统运维?

1. 故障预测与预防 数据收集与分析&#xff1a;通过收集系统的各种运行数据&#xff0c;如服务器性能指标&#xff08;CPU使用率、内存占用、磁盘I/O等&#xff09;、网络流量数据、应用程序日志等。利用AI算法对这些海量数据进行分析&#xff0c;挖掘数据中的模式和相关性。例…...

springboot学习-分页/排序/多表查询的例子

最近喜欢上了springboot&#xff0c;真是个好的脚手架。今天继续学习分页/排序/多表查询等复杂功能。按步骤记录如下. 按步骤做的发现不可用&#xff0c;最终还是用的jdbctemplate解决。这也是一次经验。总计在最后。 1.maven依赖 首先从https://start.spring.io/ 选择需要的…...

windows 应用 UI 自动化实战

UI 自动化技术架构选型 UI 自动化是软件测试过程中的重要一环&#xff0c;网络上也有很多 UI 自动化相关的知识或资料&#xff0c;具体到 windows 端的 UI 自动化&#xff0c;我们需要从以下几个方面考虑&#xff1a; 开发语言 毋庸置疑&#xff0c;在 UI 自动化测试领域&am…...

ffmpeg命令详解

原文网址&#xff1a;ffmpeg命令详解_IT利刃出鞘的博客-CSDN博客 简介 本文介绍ffmpeg命令的用法。 命令示例 1.mp4和avi的基本互转 ffmpeg -i D:\input.mp4 E:\output.avi ffmpeg -i D:\input.avi E:\output.mp4 -i 表示input&#xff0c;即输入。后面填一个输入地址和一…...

【漏洞复现】CVE-2022-43396

漏洞信息 NVD - CVE-2022-43396 In the fix for CVE-2022-24697, a blacklist is used to filter user input commands. But there is a risk of being bypassed. The user can control the command by controlling the kylin.engine.spark-cmd parameter of conf. 背景介绍…...

文件的摘要算法(md5、sm3、sha256、crc)

为了校验文件在传输中保证完整性和准确性&#xff0c;因此需要发送方先对源文件产生一个校验码&#xff0c;并将该值传输给接收方&#xff0c;将附件通过ftph或http方式传输后&#xff0c;由接收方使用相同的算法对接收文件再获取一个新的校验码&#xff0c;将该值和发送方传的…...

如何借助AI生成PPT,让创作轻松又高效

PPT是现代职场中不可或缺的表达工具&#xff0c;但同时也可能是令人抓狂的时间杀手。几页幻灯片的制作&#xff0c;常常需要花费数小时调整字体、配色与排版。AI的飞速发展为我们带来了革新——AI生成PPT的技术不仅让制作流程大大简化&#xff0c;还重新定义了效率与创意的关系…...

云技术-docker

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团…...

对docker安装的mysql实现主从同步

1:分别安装mysql主,从数据库 将主库容器名称改为mysql_master,将从库容器名称改为mysql_slave 安装教程:docker安装mysql 2:配置主库的my.cnf挂载文件 [mysqld] #log-bin&#xff1a;表示启用binlog功能&#xff0c;并指定二进制日志的存储目录。 log-binmysql-bin #binlog_f…...

【不定长滑动窗口】【灵神题单】【刷题笔记】

采摘水果 fruits[i]表示第i棵树上的水果种类目的是尽可能多收集水果规矩: 只有两个篮子&#xff0c;且每个篮子只能装一种水果&#xff0c;但是每个篮子能装的总量没限制一旦开始采摘&#xff0c;就会连续采摘&#xff0c;把两个篮子都用掉也就是说&#xff0c;采摘到最后一颗…...

AI写论文指令

一、论文选题指令 1、确定研究对象&#xff1a;我是一名xxx&#xff0c;请从以下素材内容中&#xff0c;结合xx相关知识&#xff0c;提炼出可供参考的学术概念 。以下是结合素材内容&#xff0c;提炼出的几个可供参考的学术概念 概念a&#xff1a;概念b&#xff1a;概念C&…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...