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

【C语言】详讲qsort库函数

qsort函数介绍

  1. 具体作用

qsort函数是一种用于对不同类型数据进行快速排序的函数,排序算法有很多

最常用的冒泡排序法仅仅只能对整形进行排序,qsort不同,排序类型不受限制,

qsort函数的底层原理是一种快速排序.


  1. 基本构造

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函数是一种用于对不同类型数据进行快速排序的函数&#xff0c;排序算法有很多最常用的冒泡排序法仅仅只能对整形进行排序,qsort不同,排序类型不受限制,qsort函数的底层原理是一种快速排序.基本构造qsort( void* arr, int sz, int sizeof, cmp_code);…...

SEO技术风口来了|SEO能否抓住全球约93%的网络用户?

开篇词作者/出品人 | 美洽 SEO 流量专家 白桦为什么要做一个 SEO 专栏&#xff1f;在一部分人眼中&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;已经是老掉牙的玩意儿&#xff0c;在这个信息爆炸的年代&#xff0c;它似乎已经无法承担吸引流量的主要作用。但&#xff…...

mxnet版本与numpy,requests等都不兼容问题

简介 跟着李沐学AI时遇到的mxnet环境问题。 问题 使用pip install mxnet时会重新安装相匹配的numpy和requests&#xff0c;而这新安装的这两个版本不满足d2l所需的版本。 然后报错&#xff1a; ERROR: pips dependency resolver does not currently take into account all …...

逆向分析——壳

你脑海中的壳是什么 壳在自然界是动物的保护壳&#xff0c;软件同样有保护壳&#xff0c;为了防止破解 也许大海给贝壳下的定义是珍珠&#xff0c;也许时间给煤炭下的定义是钻石 ——沙与沫 壳的由来 在DOS时代&#xff0c;壳一般指的是磁盘加密软件中的一段加密程序 后来发展…...

为 Argo CD 应用程序指定多个来源

在 Argo CD 2.6 中引入多源功能之前,Argo CD 仅限于管理来自 单个 Git 或 Helm 存储库 的应用程序。用户必须将每个应用程序作为 Argo CD 中的单个实体进行管理,即使资源存储在多个存储库中也是如此。借助多源功能,现在可以创建一个 Argo CD 应用程序,指定存储在多个存储库…...

verilog specify语法

specify block用来描述从源点&#xff08;source&#xff1a;input/inout port&#xff09;到终点&#xff08;destination&#xff1a;output/inout port&#xff09;的路径延时&#xff08;path delay&#xff09;&#xff0c;由specify开始&#xff0c;到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&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于反向代理和网关是什么关系的内容。 一、反向代理 反向代理 是一种网络技术&#xff0c;用于将客户端的请求转发到一个或多个服务器上&#xff0c;并将响应返回给客户端。与正向代理不同&am…...

IT行业就业趋势显示:二季度平均月薪超8千

我国的IT互联网行业在近些年来规模迅速扩大&#xff0c;技能和技术水平也明显提升&#xff0c;目前IT互联网行业已经成为社会发展中新型产业的重要组成部分&#xff0c;行业的人才队伍也在不断的发展壮大&#xff0c;选择进入入互联网行业工作的人也越来越多。 根据58同城前段…...

【毕业设计】基于Java的五子棋游戏的设计(源代码+论文)

简介 五子棋作为一个棋类竞技运动&#xff0c;在民间十分流行&#xff0c;为了熟悉五子棋规则及技巧&#xff0c;以及研究简单的人工智能&#xff0c;决定用Java开发五子棋游戏。主要完成了人机对战和玩家之间联网对战2个功能。网络连接部分为Socket编程应用&#xff0c;客户端…...

C#:Krypton控件使用方法详解(第十四讲) ——kryptonSeparator

今天介绍的Krypton控件中的kryptonSeparator。下面介绍控件的外观属性如下图所示&#xff1a;Cursor属性&#xff1a;表示鼠标移动过该控件的时候&#xff0c;鼠标显示的形状。属性值如下图所示&#xff1a;DrawMoveIndicator属性&#xff1a;表示确定移动分隔符时是否绘制移动…...

Java的jar包打包成exe应用

将springboot项目使用maven打出的jar包&#xff0c;打成windows平台下exe应用程序包&#xff08;自带jre环境&#xff09;。 工具&#xff1a;1、exe4j 2、Inno Setup 工具放到网盘&#xff0c;链接&#xff1a;https://pan.baidu.com/s/1ZHX8P7u-7GBxaC6uaIC8Ag 提取码&#x…...

Latex学习笔记

Latex 学习笔记 快速入门 编译软件: TeX Live TexStudio, Ctex, 线上: Overleaf第一个示例代码&#xff1a; \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基础部分我想介绍如下几个关键点&#xff1a; 常见关键字命名空间的定义和使用缺省参数函数重载引用、指针和引用的区别内联函…...

Docker入门建议收藏 第二部分

二、Docker 容器技术与虚拟机的区别 Docker 到底是个什么东西呢&#xff1f;我们在理解 Docker 之前&#xff0c;首先得先区分清楚两个概念&#xff0c;容器和虚拟机。 虚拟机 虚拟机&#xff08;Virtual Machine&#xff09;指通过软件模拟的具有完整硬件系统功能的、运行在…...

蓝桥杯三月刷题 第7天

文章目录&#x1f4a5;前言&#x1f609;解题报告&#x1f4a5;三角回文数&#x1f914;一、思路:&#x1f60e;二、代码&#xff1a;&#x1f4a5;数数&#x1f914;一、思路:&#x1f60e;二、代码&#xff1a;&#x1f4a5;数组切分&#x1f914;一、思路:&#x1f60e;二、…...

面试官问百万数据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浏览器上传下载智能加解密,让管理更省心省力

现在员工日常工作中经常会通过浏览器访问公司的业务系统&#xff08;OA、JIRA等&#xff09;&#xff0c;或者访问其他外部系统&#xff0c;访问下载服务器的文档变得更便捷&#xff0c;工作地点也不再局限于办公室中。为确保应用系统机密安全且又不影响员工的正常工作&#xf…...

leetcode day22 位运算

位运算咋这么老难 剑指 Offer 56 - I. 数组中数字出现的次数 借评论区大佬答案&#xff1a;nums [1,2,10,4,1,4,3,3] a^a0a^0aa^b^ca^c^ba&(-a)最低位为1的二进制&#xff08;从又到左&#xff09;所有的异或结果得到sum2^108flag-8&88可分为两组&#xff0c;一组为与…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序&#xff0c;无论是测试应用程序、搜寻漏洞还是收集情报&#xff0c;它们都能提升工作流程。 FoxyProxy 代理管理工具&#xff0c;此扩展简化了使用代理&#xff08;如 Burp…...

倒装芯片凸点成型工艺

UBM&#xff08;Under Bump Metallization&#xff09;与Bump&#xff08;焊球&#xff09;形成工艺流程。我们可以将整张流程图分为三大阶段来理解&#xff1a; &#x1f527; 一、UBM&#xff08;Under Bump Metallization&#xff09;工艺流程&#xff08;黄色区域&#xff…...