【C语言】14. qsort 的底层与模拟实现

一、回调函数

回调函数就是⼀个通过函数指针调用的函数。
把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的⼀方调用的,用于对该事件或条件进行响应。

二、qsort 的底层与模拟实现

首先我们通过cplusplus来了解一下qsort函数。
在这里插入图片描述
对函数的四个参数所表示的意义:
在这里插入图片描述

2.1 qsort的使用

#include<stdio.h>
#include<stdlib.h>int com_int(const void* p1, const void* p2)
{return *(int*)p1 - *(int*)p2;
}int main()
{int arr[] = { 9,8,6,1,2,3,5,4 };qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), com_int);for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){printf("%d ", arr[i]);}printf("\n");return 0;
}

2.2 qsort 的模拟实现

#include <stdio.h>
int int_cmp(const void * p1, const void * p2)
{return (*( int *)p1 - *(int *) p2);
}void _swap(void *p1, void * p2, int size)
{int i = 0;for (i = 0; i< size; i++){char tmp = *((char *)p1 + i);*(( char *)p1 + i) = *((char *) p2 + i);*(( char *)p2 + i) = tmp;}
}void bubble(void *base, int count , int size, int(*cmp )(void *, void *))
{int i = 0;int j = 0;for (i = 0; i< count - 1; i++){for (j = 0; j<count-i-1; j++){if (cmp ((char *) base + j*size , (char *)base + (j + 1)*size) > 0){_swap(( char *)base + j*size, (char *)base + (j + 1)*size, size);}}}
}int main()
{int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };int i = 0;bubble(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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

手把手教你入门vue+springboot开发(三)--登录功能后端

文章目录 前言一、redis安装二、后端代码1.修改application.yml文件2.增加utils文件3.增加Result类4.修改UserController类5.修改UserMapper类6.修改UserService和UserServiceImpl类7.增加LoginInterceptor类8.增加WebConfig类9.修改pom.xml文件 前言 前两篇我们用vuespringbo…

《站在2024年的十字路口:计算机专业是否仍是高考生的明智之选?》

文章目录 每日一句正能量前言行业竞争现状行业饱和度和竞争激烈程度[^3^]新兴技术的影响[^3^]人才需求的变化[^3^]行业创新动态如何保持竞争力 专业与个人的匹配度判断专业所需的技术能力专业核心课程对学生的要求个人兴趣和性格特点专业对口的职业发展要求实践和经验个人价值观…

从大型语言模型到大脑语言理解:探索话语理解的神经机制

随着科技的飞速发展&#xff0c;人工智能领域取得了令人瞩目的成就。在这其中&#xff0c;大型语言模型&#xff08;LLMs&#xff09;以其卓越的性能和广泛的应用前景&#xff0c;成为了当前研究的热点。然而&#xff0c;尽管LLMs在文本生成、语言翻译等领域展现出了惊人的能力…

怎么图片转excel表格?推荐三个方法

怎么图片转excel表格&#xff1f;在信息化高速发展的今天&#xff0c;图片转Excel表格的需求日益凸显&#xff0c;尤其是在职场办公中&#xff0c;这一需求更是显得尤为迫切。为了满足广大用户的需求&#xff0c;市面上涌现出了众多图片转Excel的软件。今天&#xff0c;就为大家…

依赖自动装配

黑马程序员SSM框架 文章目录 1、依赖自动装配2、依赖自动装配的特征 1、依赖自动装配 IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配自动装配方式 按类型&#xff08;常用&#xff09;按名称按构造方法不启用自动装配 配置中使用bean标签auto…

学会python——密码校验(python实例三)

目录 1、认识Python 2、环境与工具 2.1 python环境 2.2 pycharm编译 3、纠正密码输入的格式问题 3.1 代码构思 3.2 代码示例 3.3 运行结果 4、总结 1、认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可…

华为数据驱动的企业数字化转型之路

华为数据驱动的企业数字化转型之路 数据驱动的数字化转型是企业未来发展的关键。通过构建完善的数据治理体系&#xff0c;包括差异化的数据管理、面向业务的信息架构、数据底座建设和自助数据服务&#xff0c;企业可以提升数据的利用效率和决策能力。本文将根据华为数据治理相…

Spring Boot集成Timefold Solver实现课程表编排

1. 什么是Timefold Solver&#xff1f; 每个组织都面临规划问题&#xff1a;使用一组有限的资源&#xff08;员工、资产、时间和金钱&#xff09;提供产品或服务。Timefold Solver 优化了此类规划&#xff0c;以更少的资源开展更多业务。这被称为约束满足编程&#xff08;属于…

QT QFileDialog文件选择对话框

QT QFileDialog文件选择对话框 选择txt或者cpp文件&#xff0c;读取内容并显示 参考&#xff1a; QT写入文件与读取文件内容_qt往一个文件写东西-CSDN博客 #include "QtFilePreview.h" #include "qfiledialog.h" #include "qfile.h" #includ…

怎样收集企业名单?

收集企业名单的方法按照不同维度有不同的方式&#xff0c; 通过人工一个个收集&#xff0c;通过技术手段收集&#xff0c;通过第三方进行购买。 按照来源渠道&#xff0c;可以分为官方和非官方网站&#xff0c;官方的有公示系统&#xff0c;年报等。此外一些相对于官方的平台…

redis+lua实现分布式限流

redislua实现分布式限流 文章目录 redislua实现分布式限流为什么使用redislua实现分布式限流使用ZSET也可以实现限流&#xff0c;为什么选择lua的方式实现依赖lua脚本yaml代码实现 Jmeter压测 为什么使用redislua实现分布式限流 原子性&#xff1a;通过Lua脚本执行限流逻辑&am…

【计算机视觉】人脸算法之图像处理基础知识(三)

图像处理基础知识&#xff08;三&#xff09; 1.图像二值化 顾名思义&#xff0c;图像二值化是指一张图像上只有两种大小的像素值&#xff0c;常用的是0和255&#xff0c;0表示背景&#xff0c;255表示前景。这种处理方式是非常重要的&#xff0c;大部分的图像处理都会经历该…

简单Mesh多线程合并,使用什么库性能更高

1&#xff09;简单Mesh多线程合并&#xff0c;使用什么库性能更高 2&#xff09;Unity Semaphore.WaitForSignal耗时高 3&#xff09;VS编辑的C#代码注释的中文部分乱码 4&#xff09;变量IntPtr m_cachePtr切换线程后变空 这是第389篇UWA技术知识分享的推送&#xff0c;精选了…

【复旦邱锡鹏教授《神经网络与深度学习公开课》笔记】前馈神经网络

前馈神经网络又叫全连接神经网络、多层感知器&#xff0c;在网络中信息由输入到输出单向传递&#xff0c;具体特点有&#xff1a; 个神经元分别属于不同的层&#xff0c;层内无连接相邻两层之间的神经元全部两两连接整个网络中无反馈&#xff0c;信号从输入层像输出层单向传播…

【复旦邱锡鹏教授《神经网络与深度学习公开课》笔记】梯度的反向传播算法

矩阵微积分&#xff08;Matrix Calculus&#xff09; 在开始之前&#xff0c;需要先了解矩阵微积分的一些计算规则。 首先&#xff0c;对于矩阵微积分的表示&#xff0c;通常由两种符号约定&#xff1a; 分母布局 标量关于向量的导数为列向量 向量关于标量的导数为行向量 N维…

【LeetCode:2786. 访问数组中的位置使分数最大 + 递归 + 记忆化缓存 + dp】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Real3D:利用真实世界图像扩展3D重建模型

原理&#xff1a; 在3D重建领域&#xff0c;单视图重建任务由于其固有的不确定性而充满挑战。为了克服这一难题&#xff0c;研究者们一直在探索如何利用大型数据集训练模型以学习形状和纹理的通用先验知识。然而&#xff0c;现有训练方法依赖于合成数据或多视图捕获&#xff0c…

U-Mail国产信创邮件系统,让企业通信更加安全可控

信息技术应用创新产业&#xff0c;即信创产业&#xff0c;是信息化建设的核心&#xff0c;它涵盖了从硬件到软件的一系列关键技术。信创产业的目标是通过自主研发&#xff0c;减少对外部技术的依赖&#xff0c;增强信息安全&#xff0c;并提升国内产业的全球竞争力。该产业主要…

java打印99乘法表

public class NineNineMulTable{public static void main(String[] args){for(int i 1; i < 9; i ){for(int j 1; j < i; j ){System.out.print(j " * " i " " i * j "\t");//再次先输出j在输出i是打印出来是1*2&#xff0c;2*2}S…

Allegro X PCB设计小诀窍--如何在Allegro X中快速设置快捷键

背景介绍&#xff1a;我们在进行PCB设计时&#xff0c;经常会用到一些高频次操作&#xff0c;例如移动、复制、删除、旋转、绘制走线、铺铜等&#xff0c;这些操作在软件中通常需要点击对应命令菜单来实现。为了点击这些菜单&#xff0c;设计人员需要通过鼠标频繁的在设计界面进…