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

手撕qsort函数

前言

本篇主要讲解的是qsort函数细节以及运用实例。

紧跟我的脚步一起手撕qsort函数吧~

欢迎关注​​个人主页:逸狼

更多优质内容:

拿捏c语言指针(上)

拿捏c语言指针(中)

拿捏c语言指针(下)


创造不易,可以点点赞吗~

如有错误,欢迎指出~



qsort函数介绍

qsort 函数可以实现任意数据的排序 

他的底层排序算法是快速排序,对应的头文件是string.h

我们在官网cplusplus中搜索 qsort函数 得到如图 参数 和 compar函数的返回值


参数解释

base

void*  base

base指向要排序数组的第一个元素(起始位置),void*是为了接收不同类型的数据


num

num 的返回类型是size_t 

base指向的数组的元素个数(待排序的数组的元素个数)

size

size 的返回类型是size_t 

base指向的数组的元素的大小(单位是字节)

compar

int (*compar)(const void*p1, const void*p2))函数的返回类型是int,他有两个参数分别是const void*p1const void*p2,void*是为了接收不同类型的数据,return返回时要 强制类型转化 为 被比较的数据的类型。

(*compar)是函数指针,该指针指向的函数是用来比较数组中的2个元素的,p1和p2分别指向两个不同的元素
compar函数是根据实际要比较的数据自己写的

应用qsort实现排序整形

利用qsort实现排序整形数组

//利用qsort实现排序整形数组
#include<stdio.h>
#include<stdlib.h>
int cmp_int(const void*p1,const void *p2)
{return *(int*)p1 - *(int*)p2;//(int*)是强制类型转换为int*类型
}
int main()
{int arr[10] = { 9,4,6,1,0,3,7,2,5,8 };int sz = sizeof(arr) / sizeof(arr[0]);//排序前打印for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");qsort(arr, sz, sizeof(arr[0]), cmp_int);//排序后打印for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}

代码结果

应用qsort实现排序结构体

排年龄

将年龄排成升序

//利用qsort实现排序结构体数据
#include<stdio.h>
#include<stdlib.h>
//定义一个结构体
struct Stu
{char name[20];//名字int age;//年龄
};
//不能直接使用< > ==比较
//
//1.按照年龄比较
int cmp_by_age(const void* p1, const void* p2)
{return ((struct Stu*)p1)->age -((struct Stu*)p2)->age;//      (struct Stu*)代表将p1和p1强制类型转化为结构体指针类型
}
void test()
{struct Stu arr[] = { {"zs",66},{"ls",18},{"ww",35} };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_by_age);
}int main()
{//年龄排成升序test();return 0;
}


调试结果

未排序前


排序完成


排名字

将名字排成升序

//2.按照名字比较
int cmp_by_name(const void* p1, const void* p2)
{return strcmp(((struct Stu*)p1)->name , ((struct Stu*)p2)->name);//      (struct Stu*)代表将p1和p1强制类型转化为结构体指针类型
}
void test()
{struct Stu arr[] = { {"zhangsan",66},{"lisi",18},{"wangwu",35} };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_by_name);
}int main()
{//名字排成升序test();return 0;
}

库函数strcmp

其中,比较名字(实际上是比字符串大小)

这里需要运用库函数strcmp(对应的头文件是string.h)比较字符串大小(是按照对应位置上字符的ASCII值的大小比较的)
strcmp的返回值与qsort函数的返回值一致


调试结果

相关文章:

手撕qsort函数

前言 本篇主要讲解的是qsort函数细节以及运用实例。 紧跟我的脚步一起手撕qsort函数吧~ 欢迎关注​​个人主页&#xff1a;逸狼 更多优质内容&#xff1a; 拿捏c语言指针&#xff08;上&#xff09; 拿捏c语言指针&#xff08;中&#xff09; 拿捏c语言指针&#xff08;下&…...

项目在linux上的简单部署

本文章只介绍项目的简单部署&#xff0c;暂时没有Docker部署。 项目部署有两种方式&#xff0c;一种是直接命令部署&#xff0c;第二种是用脚本&#xff0c;脚本本身也是将命令进行封装来执行。 命令 项目通过maven打包&#xff0c;启动命令&#xff1a; # 启动命令 nohup …...

MySQL安装教程(详细版)

今天分享的是Win10系统下MySQL的安装教程&#xff0c;打开MySQL官网&#xff0c;按步骤走呀~ 宝们安装MySQL后&#xff0c;需要简单回顾一下关系型数据库的介绍与历史&#xff08;History of DataBase&#xff09; 和 常见关系型数据库产品介绍 呀&#xff0c;后面就会进入正式…...

Linux platform tree下的单总线驱动程序设计(DHT11)

目录 概述 1 认识DHT11 1.1 DHT11特性 1.2 DHT11数据格式 1.3 DHT11与MCU通信 1.4 DHT11信号解析 1.4.1 起始信号 1.4.2 解析信号0 1.4.3 解析信号1 2 驱动开发 2.1 硬件接口 2.2 更新设备树 2.2.1 添加驱动节点 2.2.2 编译.dts 2.2.3 更新板卡中的.dtb 2.3 驱…...

自研爬虫框架的经验总结(理论及方法)

背景&#xff1a; 由于业务需要&#xff0c;承接一部分的数据采集工作。目前市场内的一些通用框架不太适合。故而进行了自研。 对比自研和目前成熟的框架&#xff0c;自研更灵活适配&#xff0c;可以自己组装核心方法&#xff1b;后者对于新场景的适配需要对框架本身有较高的理…...

配置基于 AWS CRT 的 HTTP 客户端

基于 AWS CRT 的 HTTP 客户端包括同步 AwsCrtHttpClient 和异步 AwsCrtAsyncHttpClient。基于 AWS CRT 的 HTTP 客户端具有以下 HTTP 客户端优势&#xff1a; 更快的 SDK 启动时间 更小的内存占用空间 降低的延迟时间 连接运行状况管理 DNS 负载均衡 SDK 中基于 AWS CRT …...

挑战杯 基于LSTM的天气预测 - 时间序列预测

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 机器学习大数据分析项目 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/po…...

我为什么不喜欢关电脑?

程序员为什么不喜欢关电脑&#xff1f; 你是否注意到&#xff0c;程序员们似乎从不关电脑&#xff1f;别以为他们是电脑上瘾&#xff0c;实则是有他们自己的原因&#xff01;让我们一起揭秘背后的原因&#xff0c;看看程序员们真正的“英雄”本色&#xff01; 一、上大学时。 …...

Unity【角色/摄像机移动控制】【1.角色移动】

本文主要总结实现角色移动的解决方案。 1. 创建脚本&#xff1a;PlayerController 2. 创建游戏角色Player&#xff0c;在Player下挂载PlayerController脚本 3. 把Camera挂载到Player的子物体中&#xff0c;调整视角&#xff0c;以实现相机跟随效果 3. PlayerController脚本代码…...

Oracle12cR2之Job定时作业调度器详解

Oracle12cR2之Job定时作业调度器详解 文章目录 Oracle12cR2之Job定时作业调度器详解1.Oracle Job1. 关于Job2. 使用方法 2. Job详细说明1. 查看Job的相关视图2.SYS.DBA_JOBS视图字段详细说明 3. 创建及查看Job1. 创建Job2. 查看运行中的Job 1.Oracle Job 1. 关于Job 在 Oracle…...

python自学...

一、稍微高级一点的。。。 1. 闭包&#xff08;跟js差不多&#xff09; 2. 装饰器 就是spring的aop 3. 多线程...

Message Pack 协议详解及应用

文章目录 一、Message Pack是什么二、Message Pack的语法规则三、Message Pack相关链接四、Message Pack应用场景五、MessagePack 兼容性与特点 一、Message Pack是什么 Message Pack是一种高效的二进制序列化格式&#xff0c;用于在不同的应用程序之间进行数据交换。它类似于J…...

智慧社区管理系统:构建未来的生活模式

在这个信息化、智能化的时代&#xff0c;我们期待的不再是简单的居住空间&#xff0c;而是一个集安全、便捷、舒适、环保于一体的智能化社区。为此&#xff0c;我们推出了全新的智慧社区管理系统&#xff0c;旨在将先进的科技力量引入社区管理&#xff0c;为居民提供更优质的生…...

Rocky 8.9 Kubespray v2.24.0 在线部署 kubernetes v1.28.6 集群

文章目录 1. 简介2. 预备条件3. 基础配置3.1 配置hostname3.2 配置互信 4. 配置部署环境4.1 在线安装docker4.2 启动容器 kubespray4.3 编写 inventory.ini4.4 关闭防火墙、swap、selinux4.5 配置内核模块 5. 部署6. 集群检查 1. 简介 kubespray​ 是一个用于部署和管理 Kuber…...

新版AI系统ChatGPT源码支持GPT-4/支持AI绘画去授权

源码获取方式 搜一搜&#xff1a;万能工具箱合集 点击资源库直接进去获取源码即可 如果没看到就是待更新&#xff0c;会陆续更新上 新版AI系统ChatGPT网站源码支持GPT-4/支持AI绘画/Prompt应用/MJ绘画源码/PCH5端/免授权&#xff0c;支持关联上下文&#xff0c;意间绘画模型…...

学习鸿蒙基础(5)

一、honmonyos的page路由界面的路径 新建了一个page,然后删除了。运行模拟器的时候报错了。提示找不到这个界面。原来是在路由界面没有删除这个page。新手刚接触找了半天才找到这个路由。在resources/base/profile/main_pages.json 这个和微信小程序好类似呀。 吐槽&#xf…...

Tuxera NTFS2024最新中文版支持M1/M2/M3苹果全系机型

Tuxera NTFS的传输速度会受到多种因素的影响&#xff0c;包括硬件配置、文件大小、存储设备的性能等。因此&#xff0c;无法给出具体的传输速度数值。 不过&#xff0c;根据一些用户的使用经验和测试数据&#xff0c;Tuxera NTFS的传输速度通常都非常快&#xff0c;能够满足大…...

【Python】OpenCV-图片添加水印处理

图片添加水印处理 1. 引言 图像处理中的水印添加是一种常见的操作&#xff0c;用于在图片上叠加一些信息或标识。本文将介绍如何使用OpenCV库在图片上添加水印&#xff0c;并通过详细的代码注释来解释每一步的操作。 2. 代码示例 以下是一个使用OpenCV库的简单代码示例&…...

Milvus数据库介绍

参考&#xff1a;https://www.xjx100.cn/news/1726910.html?actiononClick Milvus 基于FAISS、Annoy、HNSW 等向量搜索库构建&#xff0c;核心是解决稠密向量相似度检索的问题。在向量检索库的基础上&#xff0c;Milvus 支持数据分区分片、数据持久化、增量数据摄取、标量向量…...

notepad++的下载与使用

1.进入官网下载 https://notepad-plus-plus.org/ 点击下载即可 2.选择中文简体 3.建议安装在D盘 其余步骤按照指示就行 4.安装后这几个是必选的 设置完成后就可以写中文了 以此为例 结果为...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...