C语言-----qsort函数的功能以及模拟实现

1.冒泡排序

(1)冒泡排序就是数据两个两个的进行比较每一趟都是一个数和其他的所有的数字比较,

(2)这个要的是升序排列,所以前面的大的话,就会调换位置

(3)冒泡排序的缺点就是只能比较整形数据,其他类型的数据无法进行比较,这个时候引入qsort

2.qsort函数介绍

(1)这个函数有4个参数,第一个是指向起始地址的指针,第二个是需要比较的元素个数

第三个是单个元素的大小,最后的是函数指针,指向函数的地址,参数都是void*类型的

(2)首先,void*就是没有固定的数据类型,不能直接进行解引用的操作,而且不能加减

整数进行指针的移动

(3)返回值

qsort函数的返回值就是第一个指针指向的元素大于第二个指针指向的元素就返回正数,小于就返

回负数,相等就会返回0;我们可以直接使用两者的插值作为返回值,这样也满足要求的;

(4)比较整数

这个是用qsort函数实现排序,把void*类型的指针转换成为int*类型之后就可以解引用,利用2个数

的差值作为返回值,int_cmp是指向函数可以比较两个数的大小;

(5)比较结构体数据---根据年龄

1.return里面的是结构体成员访问操作符,显示强制类型转换成为结构体类型,再进行解引用;

2.定义结构体数组,里面含有3个元素,sizeof(s[0])是计算第一个结构体成员的大小;

(6)比较结构体数据----根据名字

(1)strcmp是库函数,专门用来比较字符串的大小,他的比较原理就是通过指向第一个字符的指

针的移动,依次进行比较,返回值的原理和qsort相同;

(2)sizeof(s)/sizeof(s[0])是计算结构体成员的个数;

3.函数的模拟实现

(1)这个就是借助冒泡排序函数实现qsort的功能

(2)void bubble里面的cmp指向int_cmp函数,这里相当于是回调函数,

(3)swap函数就是用来交换的,只是这里不知道数据的类型,这个里面是强制类型转换为

char*类型的数据,因为char*一次一个字节,力度更加的细致,if语句是判断是否满足交换的

条件,cmp相当于是int_cmp的地址,运行到cmp的时候就会调用int_cmp函数,返回值大于

0的时候就会执行swap函数进行交换

(4)swap在进行交换的时候,是一个字节一个字节的进行交换,如果是整形数据,就需要

进行4次循环,size就是单个数据类型的大小,用来控制循环的次数;

(5)swap函数传参的时候,不仅需要交换的两个元素的起始地址,还要知道什么时候停止,

所以要知道size,就是单个数据类型的大小也要作为参数,这只会完成一组数据的交换,如此

满足条件,就还会像这样执行swap函数进行交换。

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

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

相关文章

【开源】JAVA+Vue.js实现高校宿舍调配管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能需求2.1 学生端2.2 宿管2.3 老师端 三、系统展示四、核心代码4.1 查询单条个人习惯4.2 查询我的室友4.3 查询宿舍4.4 查询指定性别全部宿舍4.5 初次分配宿舍 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的…

【C语言基础】:深入理解指针(三)

文章目录 深入理解指针一、冒泡排序二、二级指针三、指针数组3.1 指针数组模拟二维数组 四、字符指针变量五、数组指针变量5.1 数组指针变量是什么?5.2 数组指针变量的初始化 六、二维数组传参的本质 深入理解指针 指针系列回顾: 【C语言基础】&#xf…

L2-008 最长对称子串(java题解)

对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。 输入格式: 输入在一行中给出长度不超过1000的非空字符串。 输出格式&a…

JavaScript 中的 sort 传入 (a,b) => b - a 会是升序还是降序?为什么呢?

在 JavaScript 中的数组有内建的 sort 方法,可以让我们不用自己手写排序算法,也能够有高效能的排序方法可用。然而,你知道sort 要怎么用吗? 在sort 中要传入的compareFn 又是如何运作的? 当compareFn 是(a, b) => b - a 时,排序会是升序还是降序? 为什么呢? 这一连…

用户登录问题——登录态

不论在任何系统中,用户体系都是重中之重,而怎么建立一个完善的,安全的用户体系,是所有开发者都在思考的问题。 而这里就来思考一下,用户登录问题。 登录的作用主要就是用户认证,与权限认证,也…

云原生周刊:CNCF 宣布 Falco 毕业|2024.3.4

开源项目推荐 ldap-operator 用于部署和管理 LDAP 目录的 Kubernetes Operator。 Updatecli Updatecli 是一个用于应用文件更新策略的工具。每个应用程序“运行”时都设计为可在任何地方使用,它会检测是否需要使用自定义策略更新值,然后根据该策略应…

UOS 与 Ubuntu 命令行打开安装包界面,双击打开界面调用安装包界面展示

UOS 使用deepin-deb-installer安装程序 deepin-deb-installer xxxxxxx.deb & Ubuntu snap-store --local-filename /home/seven/wps-office_1xxxxxxx.deb &

ubuntu20.04安装ros并配置相关环境以及驱动AUBO i5机械臂

ubuntu20.04安装ros并配置相关环境以及驱动AUBO i5机械臂 安装ros安装rosdep(小鱼的rosdepc,又快又好用)环境配置下载并编译aubo roslib库环境变量配置aubo gazeboaubo rviz驱动真实机械臂 安装ros 搜索鱼香ros网站https://fishros.com/,根据一键安装ros里提供的指…

【数据结构】二、线性表:1.顺序表的定义与实现(静态分配、动态分配)

文章目录 线性表linear list基本操作1.顺序表1.1静态分配1.2动态分配 线性表linear list 线性表是具有相同数据类型的n (n≥0)个数据元素的有限序列,其中n为表长,当n0时线性表是一个空表。 若用L命名线性表,则其一般表示为&#…

自动填充MyBatis-Plus日志中的sql语句参数小工具

写在前面:大家好!我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正,感谢大家的不吝赐教。我的唯一博客更新地址是:https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油,冲鸭&#x…

Chromium内核浏览器编译记(四)Linux版本CEF编译

转载请注明出处:https://blog.csdn.net/kong_gu_you_lan/article/details/136508294 本文出自 容华谢后的博客 0.写在前面 本篇文章是用来记录编译Linux版本CEF的步骤和踩过的坑,以防止后续再用到的时候忘记,同时也希望能够帮助到遇到同样问…

Crow 编译和环境搭建

Crow与其说是编译,倒不如说是环境搭建。Crow只需要包含头文件,所以不用编译生成lib。 Crow环境搭建 boost(可以不编译boost,只需要boost头文件即可)asio (可以不编译,直接包含头文件。不能直接…

【Linux】软件管理器yum和编辑器vim

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 文章目录 一、Linux下安装软件的方案1.1 源代码安装1.2 rpm安装1.3 yum安装 二、Linux软件…

Spring Boot 配置热部署

前言 对于 Spring Boot 项目之中, 在刚开始学习的时候, 每当代码进行变动的时候, 想要生效那就必须要手动重启. 为什么要重启呢 ? 原因在于写的代码是依靠运行之后的 class 文件运行的, 当我们的代码更新以后, 如果不去手动重启, 那么就无法生成新的 class 文件, 执行的就是旧…

C#关键字学习

前言 记录C#编程中用到的关键字,对关键字的用途进行解释、记录、学习。会持续更新。 1. volatile 在C#中,volatile关键字用于声明一个字段(通常是一个共享的字段)是易变的,即每次访问该字段时,都要从内存…

蓝桥杯物联网竞赛_STM32L071_11_知识体系的查漏与补缺

太久没学单片机了,再重新过一遍查漏补缺,对其中之前没怎么在意的,而现在又发觉的问题进行再分析与补充 1. debug serial wire是干什么用的 这个东西我勾选不勾选都对我的程序没有什么影响,我很好奇是干什么用的,网上查…

vue3+elementPlus:el-table-column表格列动态设置单元格颜色

:cell-style属性 //html<el-tableempty-text"暂无数据":data"datalist.table":max-height"height"row-key"id"border:cell-style"cellStyle"> <el-table>//js //动态设置单元格颜色 const cellStyle ({ row, c…

Java后台面试相关知识点解析

文章目录 JavaJava中四种引用类型及使用场景集合HashMap源码及扩容策略HashMap死循环问题ConcurrentHashMap与HashtableConCurrentHashMap 1.8 相比 1.7 判断单链表是否有环&#xff0c;并且找出环的入口IO线程池线程池的几种创建方式判断线程是否可以回收线程池的7大核心参数线…

Golang 常用的时间转换

1、获取 Y-m-d H:i:s 格式的当前时间 t : time.Now().Format(time.DateTime) 2、获取当前时间戳 currentTime : time.Now() timestamp : currentTime.Unix() // 获取秒级时间戳 3、Y-m-d H:i:s 格式转时间戳 timeStr : "2023-09-01 12:00:00" t, err : time.Par…

matlab 仿真IIR低通滤波器,显示滤波前后的波形和频谱

figure fs500;%采样率 f130;%信号频率 f270;%信号频率 f3 100;%信号频率 f4 150;%信号频率 T2;%时宽2s nround(T*fs);%采样点个数 tlinspace(0,T,n);%时域横坐标 x sin(2*pi*f1*t) sin(2*pi*f2*t) sin(2*pi*f3*t) 2*cos(2*pi*f4*t); subplot(221); plot(t,x);%画时域图 xl…