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 认证使用浏览器进行身份验…

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;总有我帮您踩过的坑…

解决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…

字节码

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

排查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 # 安装 …

力扣--199.二叉树的右视图

题目 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 提示: 二叉树的节点个数的范围是 [0,100] -100 < Node.val < 100 代码 class Solution { public List rightSideV…

Ubuntu Server 22.04.5 LTS重启后IP被重置问题

Ubuntu Server 22.04.5 LTS重启后IP被重置问题 最近在使用Ubuntu Server 22.04做项目开发测试时发现每次重启和关机后&#xff0c;所设置的静态IP地址都会回复到安装系统时所设置的ip Ubuntu Server 22.04 官网下载地址&#xff1a;Ubuntu官方下载地址 对虚拟机下安装Ubuntu感…

kube-proxy的iptables工作模式分析

系列文章目录 iptables基础知识 文章目录 系列文章目录前言一、kube-proxy介绍1、kube-proxy三种工作模式2、iptables中k8s相关的链 二、kube-proxy的iptables模式剖析1.集群内部通过clusterIP访问到pod的流程1.1.流程分析 2.从外部访问内部service clusterIP后端pod的流程2.1…

华为网络设备配置文件备份与恢复(上传、下载、导出,导入)

在日常运维工作中&#xff0c;会经常存在网络割接的情况&#xff0c;为了保证网络割接失败时能重新回退至原有配置&#xff0c;从而不影响原有的办公环境&#xff0c;在网络割接前的备份工作就非常有必要了。 备份方式&#xff1a;FTP 备份技术&#xff1a;PC客户端<---&g…

清风数学建模学习笔记——Topsis法

数模评价类&#xff08;2&#xff09;——Topsis法 概述 Topsis:Technique for Order Preference by Similarity to Ideal Solution 也称优劣解距离法&#xff0c;该方法的基本思想是&#xff0c;通过计算每个备选方案与理想解和负理想解之间的距离&#xff0c;从而评估每个…

[软件工程]九.可依赖系统(Dependable Systems)

9.1什么是系统的可靠性&#xff08;reliability&#xff09; 系统的可靠性反映了用户对系统的信任程度。它反映了用户对其能够按照预期运行且正常使用中不会失效的信心程度。 9.2什么是可依赖性&#xff08;dependablity&#xff09;的目的 其目的是覆盖系统的可用性&#x…

减少30%人工处理时间,AI OCR与表格识别助力医疗化验单快速处理

在医疗行业&#xff0c;化验单作为重要的诊断依据和数据来源&#xff0c;涉及大量的文字和表格信息&#xff0c;传统的手工输入和数据处理方式不仅繁琐&#xff0c;而且容易出错&#xff0c;给医院的运营效率和数据准确性带来较大挑战。随着人工智能技术的快速发展&#xff0c;…

汽车一键启动开关 、一键启动按键 、一键启动按钮

‌汽车一键启动按钮是智能汽车的重要部分&#xff0c;通常用于启动和关闭引擎‌。 ‌具体功能‌&#xff1a; ‌启动引擎‌&#xff1a;在许多现代汽车中&#xff0c;一键启动按键取代了传统的钥匙启动方式。只需轻轻按下一键启动按钮&#xff0c;车辆电源即被接通&#xff0c…