qsort函数用法,以及模拟实现

函数定义

ee92199d79824631935232641310a166.png

基于快速排列的一个函数,它的四个参数的含义:

1、void* base,是排序开始的地址

2、size_t num  想要排列的个数

3、size_t size   排列对象,一个占多少空间(字节)

4、int (*comper)(void*,void*) 我们自己写的对比函数,用于确定元素排列的顺序,是逆序还是正序

(其返回值决定,是否交换这两个数,返回值  >0  时 交换)

其用法一般如下:(以int 型示例)

//  升序排列(当前者>后者,返回正数 1 表示交换)
int comper(void* a, void* b){if (*(int*)a > *(int*)b)return 1;else if (*(int*)a < *(int*)b)return -1;elsereturn 0;//简化为
// return *(int*)a-*(int*)b;}

为什么都是void 型呢?因为void具有广泛性,所有的类型都能使用这个函数



下面示例实现,int类型的升序排列

#include<stdlib.h>
// 根据需求,自定义比较函数,
// 比较类型int  升序
int comper_int(void* a, void* b)
{//根据想要的类型,强制转换return *(int*)a - *(int*)b;
//想要降序,只需要颠倒a与b的位置
}int main()
{int arr[] = { 3,9,1,6,3,10,2,0,4,8 };// 求元素个数int num = sizeof(arr) / sizeof(arr[0]);// 求一个元素所占字节大小int size = sizeof(arr[0]);qsort(arr,num , size, comper_int);int i = 0;for (i = 0; i < num; i++){printf("%d ", arr[i]);}// 0 1 2 3 3 4 6 8 9 10return 0;
}

其他类型也可以,比如 浮点型:

#include<stdlib.h>
//float型,降序
int comper_f(void* em1, void* em2)
{return *(float*)em2 - *(float*)em1;
}int main()
{float brr[] = { 4.5,10.666,1.1, 3.09,2.959 };// 求元素个数int num = sizeof(brr) / sizeof(brr[0]);// 求一个元素所占字节大小int size = sizeof(brr[0]);qsort(brr, num, size, comper_f);int i = 0;for (i = 0; i < num; i++){printf("%.3f  ", brr[i]);}// 10.666  4.500  3.090  2.959  1.100return 0;
}

模拟实现 qsort 函数的功能:

// 不确定函数类型,一个字节一个字节的交换
void Swap_(char* a, char* b, int n)
{while (n--){char c = *a;*a = *b;*b = c;a++;b++;}
}void my_qsort(void* base, size_t num, size_t size, int(*comper)(void*, void*))
{int i = 0;// 比较多少趟for (i = 0; i < (int)num-1; i++){int j = 0;// 每趟左右俩数比较多少次for (j = 0; j < (int)num - 1 - i; j++){//不确定元素类型,就用元素所占字节来确定位置// 去一趟确定一个末尾的数,少一个要比较的数if (comper((char*)base + j * size, (char*)base + (j + 1) * size) > 0){//满足条件 交换位置Swap_((char*)base + j * size, (char*)base + (j + 1) * size, size);}}}
}int comper_int(void* a, void* b)
{return *(int*)a - *(int*)b;
}int main()
{int arr[] = { 3,9,1,6,3,10,2,0,4,8 };int num = sizeof(arr) / sizeof(arr[0]);int size = sizeof(arr[0]);my_qsort(arr, num, size, comper_int);int i = 0;for (i = 0; i < num; i++){printf("%d ", arr[i]);}return 0;
}

在my_qsort  函数中为什么使用(char*)呢?

因为:

面对不同要比较的类型,所占字节不一定,

而char 所占一个字节就是最小单位,

它的访问权限也就是一个字节大小,

在最小单位的基础上,根据加减 类型的size(字节数)来准确确定位置;

Swap函数也是同理,一个字节是最小单位,

每个字节所对应的值都交换了,俩数也就交换了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS7虚拟机 网络适配器 NAT模式和桥接模式区别

一、环境介绍 宿主机&#xff1a;Windows电脑 虚拟机&#xff1a;VMware下的CentOS7 局域网&#xff1a;路由器下的各真实主机组成的网络 内部局域网&#xff1a;宿主机构建的一个内部网路 二、NAT和桥接网络链接模式区别 NAT模式&#xff1a;相当于宿主机构建一个内部局域网&a…

全面解析DApp开发中的智能合约设计

在DApp的开发过程中&#xff0c;智能合约的设计起到了至关重要的作用。智能合约是运行在区块链上的程序&#xff0c;负责处理和执行DApp中的逻辑、交易和数据存储。下面我们将深入探讨智能合约的设计原则、挑战和优化方法&#xff0c;帮助开发者掌握如何设计高效、安全的智能合…

锐捷Web认证

文章目录 Web认证二代 Web 认证配置 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Datacom专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年12月6日11点40分 Web认证 Portal 认证、Web认证 Web认证的介绍 Web 认证使用浏览器进行身份验…

详解日志格式配置:XML 与 Spring Boot 配置文件格式

详解日志格式配置&#xff1a;XML 与 Spring Boot 配置文件格式 日志是现代应用程序中不可或缺的一部分&#xff0c;通过定制化日志格式和颜色&#xff0c;开发人员可以更方便地调试和监控应用。本文将深入讲解如何在 XML 配置文件 和 Spring Boot 配置文件 中设置日志格式&am…

KernelShark在ubuntu24.04.01的编译

KernelShark在ubuntu24.04.01的编译 写在前面具体过程装ubuntu24.04.01安装depends下载代码如何编译cmake 输出make 输出 如何安装 初步启动Add the User to the perf Group 简单的使用trace-cmd抓包 来看我的文章&#xff0c;必有所得。 平凡中&#xff0c;总有我帮您踩过的坑…

Ionic 8.4 简介

Ionic 是一个用于开发混合移动应用、渐进式Web应用&#xff08;PWA&#xff09;以及桌面应用的开源框架。它结合了 Angular、React 或 Vue.js 等现代前端框架与 Cordova/PhoneGap 的力量&#xff0c;允许开发者使用 Web 技术&#xff08;HTML, CSS, JavaScript&#xff09;构建…

浏览器数据存储方法深度剖析:LocalStorage、IndexedDB、Cookies、OPFS 与 WASM - SQLite

在当今的 Web 开发领域&#xff0c;选择合适的浏览器数据存储方法对于构建高效、功能丰富的应用程序至关重要。随着 Web 应用的不断演进&#xff0c;从早期的静态 HTML 页面到如今复杂的单页应用和本地优先应用&#xff0c;数据存储需求也日益多样化。本文将深入探讨 LocalStor…

要使用 OpenResty 创建一个接口,返回客户端的 IP 地址,并以 JSON 格式输出

要使用 OpenResty 创建一个接口&#xff0c;返回客户端的 IP 地址&#xff0c;并以 JSON 格式输出 要使用 OpenResty 创建一个接口&#xff0c;返回客户端的 IP 地址&#xff0c;并以 JSON 格式输出方案一解决方案&#xff08;openresty使用cjson&#xff09;说明&#xff1a;使…

解决Unity编辑器Inspector视图中文注释乱码

1.问题介绍 新创建一个脚本&#xff0c;用VS打开编辑&#xff0c;增加一行中文注释保存&#xff0c;在Unity中找到该脚本并选中&#xff0c;Inspector视图中预览的显示内容&#xff0c;该中文注释显示为乱码&#xff0c;如下图所示&#xff1a; 2.图示解决步骤 按上述步骤操作…

【AIGC半月报】AIGC大模型启元:2024.12(上)

【AIGC半月报】AIGC大模型启元&#xff1a;2024.12&#xff08;上&#xff09; &#xff08;1&#xff09;OpenAI-12日发布会&#xff08;持续更新中........&#xff09;Day01-12.06&#xff1a;o1满血版上线&#xff08;已发布&#xff09;Day02-12.07&#xff1a;强化微调&a…

JDK21新特性

目录 虚拟线程&#xff08;JEP 444&#xff09;&#xff1a; 顺序集合&#xff08;JEP 431&#xff09;&#xff1a; 字符串模板&#xff08;JEP 430&#xff09;&#xff1a; 模式匹配的增强&#xff08;JEP 440、441以及443&#xff09;&#xff1a; 结构化并发和作用域值…

【linux 查看网卡设备信息命令记录】

查看设备信息命令 查看网卡芯片相关platform类型网卡(gmac网卡为例)PCI网卡(rtl8125为例) 查看网卡芯片相关 platform类型网卡(gmac网卡为例) gmac 属于CPU资源的一部分&#xff0c;属于平台设备。下面以FT2004 的CPU为例&#xff0c;自带GMAC0和GMAC1。 1、通过平台设备查看…

字节码

字节码 1、字节码文件概述 1.1、字节码文件是跨平台的吗&#xff1f; ​ Java 虚拟机不和包括 Java 在内的任何语言绑定&#xff0c;它只与“Class 文件”这种特定的二进制文件格式所关联。 ​ 无论使用何种语言进行软件开发&#xff0c;只要能将源文件编译为正确的Class文件…

nodejs后端项目使用pm2部署

nodejs后端项目使用pm2部署 安装pm2 npm install pm2 -g查看版本号 pm2 --version启动项目 pm2 start app.js# 设置别名 pm2 start app.js --name demo停止项目 pm2 stop [AppName] pm2 stop [ID]# 停止所有项目 pm2 stop all重启项目 pm2 restart [AppName] pm2 re…

运算符与表达式——培训记录

0.引入 1.计算机通过计算去解决问题的。 Q&#xff1a;这个计算到底是按照什么方式去进行计算的&#xff1f; A&#xff1a;通过各种运算符去进行计算。 --->运算符与表达式 1.运算符 1.运算符&#xff1a;用来进行某种运算的符号。如: - * / % 2.几目运算符&#xf…

排查bug的通用思路

⭐️前言⭐️ APP点击某个按钮没有反应/PC端执行某个操作后&#xff0c;响应较慢&#xff0c;通用的问题排查方法: 从多个角度来排查问题 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f349;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评…

AI 建站:Durable

网址&#xff1a;https://app.durable.co 步骤 1) 登录 2&#xff09;点击创建新业务 3&#xff09;填写信息后&#xff0c;点击创建 4&#xff09;进入业务 5&#xff09;生成网站 6&#xff09;生成完成后不满意的话可以自己调整 7&#xff09;点击保存 8&#xff09;发布 …

部署kafka并通过python操作

目录 一、安装JDK1.81、检查服务器是否已安装JDK2、若已安装JDK&#xff0c;进行卸载3、更新yum源4、搜索JDK1.8安装包5、安装JDK1.86、查看是否安装成功7、配置环境变量 二、安装Kafka1、下载并解压kafka部署包至/usr/local/目录2、修改server.properties3、修改/etc/profile4…

【Linux】 进程池 一主多从 管道通信

目录 1.代码介绍 2.channel 类 3.进程池类编写 4.主函数及其他 5. 源码 1.代码介绍 本文代码采用一主多从式&#xff08;一个主进程&#xff08;master&#xff09;多个子进程&#xff08;worker&#xff09;&#xff09;通过管道进行通信&#xff0c;实现主进程分发任务&…

Ubuntu环境安装RabbitMQ

1.安装Erlang RabbitMq需要Erlang语⾔的⽀持&#xff0c;在安装rabbitMq之前需要安装erlang # 更新软件包 sudo apt-get update # 安装 erlang sudo apt-get install erlang 查看erlang版本 : erl 退出命令:halt(). 2. 安装RabbitMQ # 更新软件包 sudo apt-get update # 安装 …