(C语言)qsort函数模拟实现

news/2024/4/19 20:55:37/

前言

我们需先了解qsort函数

qsort函数详解:http://t.csdnimg.cn/rTNv9

qsort函数可以排序多种数据类型,很是神奇,这是为什么,我们在里模拟实现这样的功能

目录

1. qsort函数模拟实现

2. 我们使用bubble_sort函数排序整形数组:

3. 再来排一下结构体:


1. qsort函数模拟实现

qsort函数内部是用快速排序实现的,在这里我们用冒泡排序实现

若还不清楚冒泡排序请看

冒泡排序:http://t.csdnimg.cn/p0oHx

我们创建一个bubble_sort函数来模拟实现qsort函数

函数可以排多种数据类型,参数绝对不能是int 类型,因此我们如此创建

void*可以存放多种类型的元素首地址,我们还要知道这个数组中有多少元素,元素个数一定是正数,size_t类型等同于unsigned int类型,还要知道每个元素占多少个字节,方便后面交换元素,还有一个用于比较的函数地址

因此bubble_sort函数主体是这样的:

if后使用我们传入的函数compar函数,完成比较并返回正数,负数,或0若前面的大则交换,调用swap函数。因为void*类型没法进行加减无法遍历数组,我们又知道最小的数据类型char是一字节,因此强制类型转换为char*类型,此时传入的数组每个与元素的字节大小发挥了重要作用,进行数组所有元素地址的计算,传给swap函数,

我们来看看swap函数:

用char类型进行元素的交换,

在这里举整形数组的例子:相当于将要交换的相邻整形都变成4个char类型进行交换,进行相对应的交换,以width==4进行循环后,整体上将相邻的整形交换成功了。其他的数据类型同理。

因此qsort函数至此模拟实现完成

2. 我们使用bubble_sort函数排序整形数组:

执行结果:

排序成功!!!

3. 再来排一下结构体:

执行结果:

排序成功!!!

至此我们成功实现了qsort函数的功能,我们的C语言功底又厚了一步。


感谢观看,感谢指正。


http://www.ppmy.cn/news/1370039.html

相关文章

React的fiber原理

在读完这篇文章之后,大家可以回到文章开头再捋一下以下几个关键词,将React的 Fiber架构原理彻底搞清楚。 关键词: requestIdleCallback、IdleDeadlineFiber:React的一个执行单元 在Fiber 出现之前,React存在什么问题…

【Linux】frp内网穿透详细教程(简单易懂)

frp内网穿透详细教程(简单易懂) 文章目录 frp内网穿透详细教程(简单易懂)frp是什么?工作原理准备工作frp工具的使用第一步:下载安装包第二步:公网部署frps第三步:内网部署frpc第四步…

卖wordpress网站模板的网站

WP模板牛 http://www.wpniu.com 上面有很多免费wordpress模板资源的网站,除了免费模板,还有付费模板。 My模板(我的模板) http://www.mymoban.com 老牌网站模板资源站,上面有wordpress模板、帝国CMS模板、WooCommerce模板可以直接免费下载…

FTP协议有两种工作方式:PORT方式和PASV方式

FTP协议的连接方式 被动FTP模式(PASV)是FTP协议的一种连接方式,FTP是File Transfer Protocol(文件传输协议)的缩写,用来在两台计算机之间互相传送文件。 释义 FTP协议有两种工作方式:PORT方式…

python自动化之项目架构搭建与思路讲解(第二天)

1.自动化测试的概念 自动化测试是指使用自动化工具和脚本来执行测试任务,以验证软件或系统的正确性和稳定性。它可以提高测试的效率和准确性,并节约时间和成本。 2.自动化脚本编写的思路 xmind文档如有需要,可在资源里自行下载 3.项目代码…

命名实体识别NER

一、什么是命名实体识别: 命名实体:通常我们将人名、地名、机构名等专有名词统称命名实体,如:周杰伦,黑山县,孔子学院,24方钢直机 顾名思议,命名实体识别(简称NER&#x…

使用 Docker 部署 Answer 问答平台

1)介绍 GitHub:https://github.com/apache/incubator-answer Answer 问答社区是在线平台,让用户提出问题并获得回答。用户可以发布问题并得到其他用户的详细答案、建议或信息。回答可以投票或评分,有助于确定有用的内容。标签和分…

基于Springboot免费搭载轻量级阿里云OSS数据存储库(将本地文本、照片、视频、音频等上传云服务保存)

一、注册阿里云账户 打开https://www.aliyun.com/,申请阿里云账户并完成实名认证(个人)。这种情况就是完成了: 二、开通OSS服务 点击立即开通即可。 三、创建Bucket 申请id和secert: 进去创建一个Accesskey就会出现以…

蓝桥杯——外卖店优先级

外卖店优先级 题目分析 这一题一看N,M,T的范围就知道不能暴力,要讨巧,怎么讨巧是重点。正常的思路是第一层for循环遍历订单(或者外卖店),第二层for循环遍历外卖店(或者订单&#x…

Muduo库编译学习(1)

1.muduo库简介 muduo是由Google大佬陈硕开发,是一个基于非阻塞IO和事件驱动的现代C网络库,原生支持one loop per thread这种IO模型,该库只支持Linux系统,网上大佬对其褒贬不一,作为小白用来学习就无可厚非了。 git仓库…

Java中遍历Set集合的4种方法。

1.使用迭代器&#xff08;Iterator&#xff09;&#xff1a; Set<Integer> num_set new HashSet<Integer>(); // 添加元素到 num_set&#xff0c;num_set.add(1)...Iterator<Integer> iterator num_set.iterator(); while (iterator.hasNext()) {Integer …

YOLOv应用开发与实现

一、背景与简介 YOLO&#xff08;You Only Look Once&#xff09;是一种流行的实时目标检测系统&#xff0c;其核心思想是将目标检测视为回归问题&#xff0c;从而可以在单个网络中进行端到端的训练。YOLOv作为该系列的最新版本&#xff0c;带来了更高的检测精度和更快的处理速…

2192. 运输问题(网络流,费用流)

活动 - AcWing W 公司有 m 个仓库和 n 个零售商店。 第 i 个仓库有 ai 个单位的货物&#xff1b;第 j 个零售商店需要 bj 个单位的货物。 货物供需平衡&#xff0c;即∑&#xff08;i1~m&#xff09;ai∑&#xff08;j1~n&#xff09;bj。 从第 i 个仓库运送每单位货物到第…

32单片机基础:PWM驱动舵机,直流电机

PWM驱动舵机 接线图如上图所示。注意&#xff0c;舵机的5V 线不能接到面包板上的正极&#xff0c;面包板上的正极只有3.3V,是STM32提供的&#xff0c;所以要接到STLINK的5V, 我们如何驱动舵机呢&#xff1f;由之前我们介绍原理知道&#xff0c;要输出如下图对应的PWM波形才行…

Vue前端的工作需求

加油&#xff0c;新时代打工人&#xff01; 需求 实现带树形结构的表格&#xff0c;父数据显示新增下级&#xff0c;和父子都显示编辑。 <template><div><el-table:data"tableData"style"width: 100%; margin-bottom: 20px"row-key"i…

MySQL中json类型的字段

有些很复杂的信息&#xff0c;我们一般会用扩展字段传一个json串&#xff0c;字段一般用text类型存在数据库。mysql5.7以后支持json类型的字段&#xff0c;还可以进行sql查询与修改json内的某个字段的能力。 1.json字段定义 ip_info json DEFAULT NULL COMMENT ip信息, 2.按…

数据结构与算法-冒泡排序

引言 在数据结构与算法的世界里&#xff0c;冒泡排序作为基础排序算法之一&#xff0c;以其直观易懂的原理和实现方式&#xff0c;为理解更复杂的数据处理逻辑提供了坚实的入门阶梯。尽管在实际应用中由于其效率问题不常被用于大规模数据的排序任务&#xff0c;但它对于每一位初…

【anget应用入门】coze国际版agent应用discord快速部署及使用

1、coze agent配置 1.1 coze介绍 概述 Coze 是新一代一站式AI Bot开发平台&#x1f680;。无论你是否有编程基础&#xff0c;都可以在 Coze 平台上快速搭建基于 AI 模型的各类问答 Bot&#xff0c;从解决简单的问答到处理复杂逻辑的对话。你可以将搭建的 Bot 发布到各类社交…

独立游戏《星尘异变》UE5 C++程序开发日志2——创建并编写一个C++类

在本篇日志中&#xff0c;我们将要用一个C类来实现一个游戏内的物品&#xff0c;同时介绍UCLASS、USTRUCT、UPROPERTY的使用 一、创建一个C类 我们在UE5的"内容侧滑菜单"中&#xff0c;在右侧空白中右键选择"新建C类"&#xff0c;然后可以选择一个想要的…

【Qt】界面布局

Qt常用布局 除Qt Designer支持可视化设计和布局界面之外&#xff0c;Qt 提供了代码方式来进行界面布局&#xff0c; 以下是几种常用的界面布局方式&#xff1a; 水平布局&#xff08;QHBoxLayout&#xff09;和垂直布局&#xff08;QVBoxLayout&#xff09;&#xff1a; QHBo…