【C语言】详讲qsort库函数
qsort函数介绍
具体作用
qsort函数是一种用于对不同类型数据进行快速排序的函数,排序算法有很多
最常用的冒泡排序法仅仅只能对整形进行排序,qsort不同,排序类型不受限制,
qsort函数的底层原理是一种快速排序.
基本构造
qsort( void* arr, int sz, int sizeof, cmp_code);
void* arr:任意类型数组的第一个首元素
int sz:数组的总元素个数
int sizeof:该数组类型字节数
cmp_code:用于交换的函数,其函数需要用户自行定义,标准为:
int cmp_code(const void * p1,const void * p2)
形参1为要交换的元素,形参2为要交换的元素的后一个元素
当返回值大于0,则表示p1>p2
当返回值小于0,则表示p1<p2
当返回值等于0,则表示p1=p2
3.使用方法
//qsort使用练习
//对整形进行排序
int My_code(const void* p1, const void* p2)
{return *((int*)p1) - *((int*)p2);
}
int main()
{int arr[5] = { 2,1,4,6,3 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr,sz,sizeof(arr[0]),My_code);int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}//对字符型排序
int My_code(const void* p1, const void* p2)
{return strcmp((char *)p1,(char *) p2);
}
int main()
{char arr[] = "badcf";int sz = strlen(arr);qsort(arr, sz, sizeof(arr[0]), My_code);puts(arr);return 0;
}//对结构体排序
//对年龄进行排序(升序)
struct Stu
{int age;char name[20];};
int My_code(const void* p1, const void* p2)
{return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age;
}
int main()
{struct Stu p[] = { {20,"zhangsan"},{19,"lisi"},{21,"wangwu"}};int sz = sizeof(p) / sizeof(p[0]);qsort(p, sz, sizeof(p[0]), My_code);int i = 0;for (i = 0; i < sz; i++){printf("%d ", (p+i)->age);}return 0;
}//对名字进行排序(升序)
struct Stu
{int age;char name[20];};
int My_code(const void* p1, const void* p2)
{return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name);
}
int main()
{struct Stu p[] = { {20,"zhangsan"},{19,"lisi"},{21,"wangwu"} };int sz = sizeof(p) / sizeof(p[0]);qsort(p, sz, sizeof(p[0]), My_code);int i = 0;for (i = 0; i < sz; i++){printf("%s ", (p + i)->name);}return 0;
}4.使用qsort模拟实现冒泡排序算法

//我们先实现一个冒泡排序
void Code_one(int* arr, int sz)
{//冒泡排序为两两比较,因此进行一轮比较得出一个元素//一轮需比较sz-1-得出的元素次,总共需要sz-1轮int i = 0;int j = 0;for (i = 0; i < sz - 1; i++){for (j = 0; j < sz - 1 - i; j++){int tmp = 0;//两两比较,进行交换if (arr[j] > arr[j + 1]){tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}for (i = 0; i < sz; i++){printf("%d ", arr[i]);}
}
int main()
{//定义整形数组//排升序int arr[] = { 2,3,1,5,6,8,9 };//计算元素个数int sz = sizeof(arr) / sizeof(arr[0]);//分装一个函数实现冒泡排序Code_one(arr, sz);return 0;
}//qsort模拟实现冒泡排序(可排任意类型)
int cmp(const void* p1,const void* p2)
{return (*(int*)p1) - (*(int*)p2);
}
void Smin(const void* p1,const void* p2, int cont)
{int i = 0;char tmp = 0;//利用循环,我们将要交换的元素内存依次交换//因为是强转为char类型,我们也有字节大小,我们只需将每一个字节交换即可for (i = 0; i < cont; i++){tmp = *((char*)p1 + i);*((char*)p1+i) = *((char*)p2 + i);*((char*)p2 + i) = tmp;}
}
void Sqort_code(void* arr, int sz, int cont, int (*m)(const void*,const void*))
{int i = 0;int j = 0;//总趟数for (i = 0; i < sz - 1; i++){//一趟冒泡排序for (j = 0; j < sz - 1 - i; j++){//在冒泡排序中,判断条件为arr[j]>arr[j+1]//而现在我们想排任意类型的数据时,我们可以调用m函数,//利用qsort性质,大于返回>0,小于返回<0,等于返回=0//而m函数参数我们可以强制转换为char*类型+j*cont(类型字节数)//因为char类型为1字节,char指针+(j*cont(类型字节数))也就等于//任意类型指针+j的表示方法,这种表示方法利于我们排列不同的类型if (m((char*)arr + j * cont, (char*)arr + (j + 1) * cont)>0){//交换,分装Smin函数用于交换,形参将要交换的元素地址和元素类型字节传过去Smin((char*)arr + j * cont, (char*)arr + (j + 1)* cont, cont);}}}
}
int main()
{//假设要将整形数组排成升序int arr[] = { 2,3,1,4,7,6,9,8 };//分装一个函数,模拟实现qsortSqort_code(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), cmp);int i = 0;for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){printf("%d ", arr[i]);}return 0;
}
相关文章:
【C语言】详讲qsort库函数
qsort函数介绍具体作用qsort函数是一种用于对不同类型数据进行快速排序的函数,排序算法有很多最常用的冒泡排序法仅仅只能对整形进行排序,qsort不同,排序类型不受限制,qsort函数的底层原理是一种快速排序.基本构造qsort( void* arr, int sz, int sizeof, cmp_code);…...
SEO技术风口来了|SEO能否抓住全球约93%的网络用户?
开篇词作者/出品人 | 美洽 SEO 流量专家 白桦为什么要做一个 SEO 专栏?在一部分人眼中,SEO(搜索引擎优化)已经是老掉牙的玩意儿,在这个信息爆炸的年代,它似乎已经无法承担吸引流量的主要作用。但ÿ…...
mxnet版本与numpy,requests等都不兼容问题
简介 跟着李沐学AI时遇到的mxnet环境问题。 问题 使用pip install mxnet时会重新安装相匹配的numpy和requests,而这新安装的这两个版本不满足d2l所需的版本。 然后报错: ERROR: pips dependency resolver does not currently take into account all …...
逆向分析——壳
你脑海中的壳是什么 壳在自然界是动物的保护壳,软件同样有保护壳,为了防止破解 也许大海给贝壳下的定义是珍珠,也许时间给煤炭下的定义是钻石 ——沙与沫 壳的由来 在DOS时代,壳一般指的是磁盘加密软件中的一段加密程序 后来发展…...
为 Argo CD 应用程序指定多个来源
在 Argo CD 2.6 中引入多源功能之前,Argo CD 仅限于管理来自 单个 Git 或 Helm 存储库 的应用程序。用户必须将每个应用程序作为 Argo CD 中的单个实体进行管理,即使资源存储在多个存储库中也是如此。借助多源功能,现在可以创建一个 Argo CD 应用程序,指定存储在多个存储库…...
verilog specify语法
specify block用来描述从源点(source:input/inout port)到终点(destination:output/inout port)的路径延时(path delay),由specify开始,到endspecify结束&…...
CMake编译学习笔记
CMake学习笔记CMake编译概述CMake学习资源CMake编译项目架构cmake指令CMakeList基础准则CMakeList编写项目构建cmake_minimum_required() 和 project()set()find_package()add_executable()aux_source_directory()连接库文件include_directories()和target_include_directories…...
Day913.反向代理和网关是什么关系 -SpringBoot与K8s云原生微服务实践
反向代理和网关是什么关系 Hi,我是阿昌,今天学习记录的是关于反向代理和网关是什么关系的内容。 一、反向代理 反向代理 是一种网络技术,用于将客户端的请求转发到一个或多个服务器上,并将响应返回给客户端。与正向代理不同&am…...
IT行业就业趋势显示:二季度平均月薪超8千
我国的IT互联网行业在近些年来规模迅速扩大,技能和技术水平也明显提升,目前IT互联网行业已经成为社会发展中新型产业的重要组成部分,行业的人才队伍也在不断的发展壮大,选择进入入互联网行业工作的人也越来越多。 根据58同城前段…...
【毕业设计】基于Java的五子棋游戏的设计(源代码+论文)
简介 五子棋作为一个棋类竞技运动,在民间十分流行,为了熟悉五子棋规则及技巧,以及研究简单的人工智能,决定用Java开发五子棋游戏。主要完成了人机对战和玩家之间联网对战2个功能。网络连接部分为Socket编程应用,客户端…...
C#:Krypton控件使用方法详解(第十四讲) ——kryptonSeparator
今天介绍的Krypton控件中的kryptonSeparator。下面介绍控件的外观属性如下图所示:Cursor属性:表示鼠标移动过该控件的时候,鼠标显示的形状。属性值如下图所示:DrawMoveIndicator属性:表示确定移动分隔符时是否绘制移动…...
Java的jar包打包成exe应用
将springboot项目使用maven打出的jar包,打成windows平台下exe应用程序包(自带jre环境)。 工具:1、exe4j 2、Inno Setup 工具放到网盘,链接:https://pan.baidu.com/s/1ZHX8P7u-7GBxaC6uaIC8Ag 提取码&#x…...
Latex学习笔记
Latex 学习笔记 快速入门 编译软件: TeX Live TexStudio, Ctex, 线上: Overleaf第一个示例代码: \documentclass{article} % 设置文档使用的文档类 % 导言区 \title{my first Latex document} \author{Jclian91} \date{\today} \begin{document} % 正文区\maket…...
【c++复习】C++的基础知识(常用关键字、缺省参数、函数重载、引用)
C基础写在开头C基础常用关键字using namespace流插入和流提取操作符内联函数(inline)宏auto关键字 (c11nullptr (c11缺省参数函数重载引用写在开头 C基础部分我想介绍如下几个关键点: 常见关键字命名空间的定义和使用缺省参数函数重载引用、指针和引用的区别内联函…...
Docker入门建议收藏 第二部分
二、Docker 容器技术与虚拟机的区别 Docker 到底是个什么东西呢?我们在理解 Docker 之前,首先得先区分清楚两个概念,容器和虚拟机。 虚拟机 虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在…...
蓝桥杯三月刷题 第7天
文章目录💥前言😉解题报告💥三角回文数🤔一、思路:😎二、代码:💥数数🤔一、思路:😎二、代码:💥数组切分🤔一、思路:😎二、…...
面试官问百万数据excel导出功能如何实现?
文章目录 背景实现1.异步处理1.1 使用job1.2 使用mq2.使用easyexcel4.多个sheet5.计算limit的起始位置6.文件上传到OSS7.通过WebSocket推送通知8.总条数可配置9.order by商品编号总结背景 用户在UI界面上点击全部导出按钮,就能导出所有商品数据。 咋一看,这个需求挺简单的。…...
理解HTTPS及配置
HTTP的弊端及HTTPS的由来 众所周知HTTP协议是以TCP协议为基石诞生的一个用于传输Web内容的一个网络协议,在“网络分层模型”中属于“应用层协议”的一种.那么在这里我们并不研究该协议标准本身,而是从安全角度去探究使用该协议传输数据本身存在的安全问题:(1)、通信使用明文(不…...
IP-guard浏览器上传下载智能加解密,让管理更省心省力
现在员工日常工作中经常会通过浏览器访问公司的业务系统(OA、JIRA等),或者访问其他外部系统,访问下载服务器的文档变得更便捷,工作地点也不再局限于办公室中。为确保应用系统机密安全且又不影响员工的正常工作…...
leetcode day22 位运算
位运算咋这么老难 剑指 Offer 56 - I. 数组中数字出现的次数 借评论区大佬答案:nums [1,2,10,4,1,4,3,3] a^a0a^0aa^b^ca^c^ba&(-a)最低位为1的二进制(从又到左)所有的异或结果得到sum2^108flag-8&88可分为两组,一组为与…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
一些实用的chrome扩展0x01
简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序,无论是测试应用程序、搜寻漏洞还是收集情报,它们都能提升工作流程。 FoxyProxy 代理管理工具,此扩展简化了使用代理(如 Burp…...
倒装芯片凸点成型工艺
UBM(Under Bump Metallization)与Bump(焊球)形成工艺流程。我们可以将整张流程图分为三大阶段来理解: 🔧 一、UBM(Under Bump Metallization)工艺流程(黄色区域ÿ…...
