冒泡函数模拟qsort函数

有关于qsort函数和冒泡函数可以跳转CSDNicon-default.png?t=N7T8https://mp.csdn.net/mp_blog/creation/editor/139388503

qsort的底层逻辑是这样的

我们冒泡排序模仿qsort必须要针对的是所以说我们要模仿qsort的底层逻辑来写

我们以整型数组来举例

#include <stdio.h>
int cmp_int(const void*p1,const void *p2)
{
	return *(int*)p1-*(int*)p2;
}
void Swap(char* buf1,char*buf2,size_t width)
{
	char tmp=0;
	for(int i=0;i<width;i++){
		tmp=*buf1;
		*buf1=*buf2;
		*buf2=tmp;
		buf1++;
		buf2++;
	}
}
void print_arr(int arr[],size_t sz)
{
	for(int i=0;i<sz;i++){
		printf("%d ",arr[i]);
	}
}
void bubble_sort(void *base,size_t sz,size_t width,int (*cmp_int)(const void*,const void*))
{
	for(int i=0;i<sz-1;i++){
		for(int j=0;j<sz-1-i;j++){
			if(cmp_int((char*)base+j*width,(char*)base+(j+1)*width)>0){
			  Swap((char*)base+j*width,(char*)base+(j+1)*width,width);
			}
		}
	}
}
void test1()
{
	int arr[]={3,2,4,5,7,8,9,6,1,0};
	size_t sz=sizeof(arr)/sizeof(arr[0]);
	bubble_sort(arr,sz,sizeof(arr[0]),cmp_int);
	print_arr(arr,sz);
}
int main()
{
test1();
	return 0;
}

我们逐语句来分析

void test1()
{
	int arr[]={3,2,4,5,7,8,9,6,1,0};
	size_t sz=sizeof(arr)/sizeof(arr[0]);
	bubble_sort(arr,sz,sizeof(arr[0]),cmp_int);
	print_arr(arr,sz);
}

我们创立一个整型数组,然后创立一个冒泡排序函数和打印函数对它们进行实现

bubble_sort(arr,sz,sizeof(arr[0]),cmp_int);
void qsort (void* base, size_t num, size_t size,
            int (*compar)(const void*,const void*));

既然是模仿我们就根据qsort的参数来一步步对应上去,这样方便适应于所有函数

base是指向待排序数组的第一个元素的指针

num是base指向数组中的元素个数

size是base指向的数组中一个元素的大小,单位是字节

第四个是一个函数指向比较两个元素的函数的指针。
该函数被重复调用排序比较两个元素。

所以我们分别将首元素地址,元素个数,元素大小,比较函数传上去

void bubble_sort(void *base,size_t sz,size_t width,int (*cmp_int)(const void*,const void*))
{
	for(int i=0;i<sz-1;i++){
		for(int j=0;j<sz-1-i;j++){
			if(cmp_int((char*)base+j*width,(char*)base+(j+1)*width)>0){
			  Swap((char*)base+j*width,(char*)base+(j+1)*width,width);
			}
		}
	}
}

因为要适用于所有类型,所以我们的参数统统用void*和无符号整型size_t来接收

然后因为要以冒泡函数为基础,所以我们的底层交换逻辑不用变

int cmp_int(const void*p1,const void *p2)
{
	return *(int*)p1-*(int*)p2;
}

这个代码在面对字符串的时候需要用到strcmp函数,建议浏览过我上一篇文章后进行相应的更改。

如果返回数大于0,我们就进行交换,但是我们要适用于所有函数所以我们要单独剥离一个函数出来

  Swap((char*)base+j*width,(char*)base+(j+1)*width,width);

这里为什么用到的是char*呢因为char字符在编译器中属于一个字节,属于是最小的字节,我们方便得到,比如8个字节或者4个字节大小的元素,我们通过width字节大小的操作就能不断的得到下面几个元素

比如说我们要交换8和9的地址就是把char*arr[0]+0*4,和char*arr[1]+0*4传过去,我们对每个字节进行交换就能得到新的元素,再比如说char*arr[0]+1*4,和char*arr[1]+1*4就得到了下标为1和2的元素进行交换,至于指针用char*指向的只是首元素的第一个字节地址,对元素本身地址并没有太大的影响,所以说我们传过去以后仍然可以对每个字节进行交换

void Swap(char* buf1,char*buf2,size_t width)
{
	char tmp=0;
	for(int i=0;i<width;i++){
		tmp=*buf1;
		*buf1=*buf2;
		*buf2=tmp;
		buf1++;
		buf2++;
	}
}

因为我们是通用的,我们在编写代码的时候就需要对所有的字节进行交换,而对字节里的实际内容交换又需要用到指针。

每交换完一个字节我们就进行交换下一个字节

最终就能实现冒泡排序的类比

感觉这篇说的有点不太好,不理解的可以在看完上一篇文章以后再回头来看一下

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI的Sam Altman搞核聚变了?!究竟是创新还是疯狂?|TodayAI

据《华尔街日报》报道&#xff0c;西雅图地区的核聚变公司Helion Energy正在与人工智能公司OpenAI洽谈一项重要交易&#xff0c;OpenAI计划“购买大量电力为数据中心提供动力”。这一消息引起了广泛关注。 OpenAI的首席执行官兼联合创始人Sam Altman已向Helion投资了3.75亿美元…

【python】成功解决“TypeError: ‘method’ object is not subscriptable”错误的全面指南

成功解决“TypeError: ‘method’ object is not subscriptable”错误的全面指南 一、引言 在Python编程中&#xff0c;TypeError: method object is not subscriptable错误是一个常见的陷阱&#xff0c;特别是对于初学者来说。这个错误通常意味着你尝试像访问列表、元组、字典…

为何PHP使用率 大幅度下降!需求量几乎为零!

用PHP的人越来越少的主要原因包括&#xff1a;市场竞争加剧、新技术的出现、性能和安全问题、以及开发者社区的变化。市场竞争加剧是其中一个突出的因素。随着Python、Node.js等现代编程语言的崛起&#xff0c;它们提供了更好的性能、更简洁的语法和更丰富的框架&#xff0c;逐…

Android音频API介绍

Android系统提供了四个层面的音频API&#xff1a; Java层MediaRecorder&MediaPlayer系列&#xff1b;Java层AudioTrack&AudioRecorder系列&#xff1b;Jni层opensles&#xff1b;JNI层AAudio&#xff08;Android O引入&#xff09; 下面分别介绍这些API的使用及特点。…

学习Python我能做些什么了?你真的了解了嘛?

工欲善其事&#xff0c;必先利其器。学习不是盲目的&#xff0c;是有目标性的。所以&#xff0c;在学习之前充分了解自己所学技能的前景&#xff0c;学完能做什么&#xff0c;大概地薪资待遇是很有必要的。 Python作为人工智能的重要编程语言&#xff0c;无论发展前景还是就业…

Python接入淘宝API接口采集商品详情页到手价优惠券信息数据:智能化营销的加速器

在电子商务领域&#xff0c;智能化营销正在成为提高效率和竞争力的关键。淘宝API提供了一套完整的解决方案&#xff0c;帮助商家实现智能化营销&#xff0c;从而提升销售业绩和顾客满意度。 库存管理&#xff1a; 淘宝API使商家能够实时监控库存水平&#xff0c;自动补货&#…

如何使用vsCode打开intel D435i深度相机

一、下载并安装相机SDK文件 1.SDK下载地址&#xff1a; Release Intel RealSense™ SDK 2.0 (v2.54.2) IntelRealSense/librealsense GitHub 2.下载后&#xff0c;双击即可安装 3.环境配置 1&#xff09;window的开始菜单&#xff0c;搜索环境变量&#xff0c;选择编辑系…

WebGL开发时尚设计系统

开发一个基于WebGL的时尚设计系统可以为用户提供一个互动、实时的3D体验&#xff0c;允许他们设计和试穿虚拟服装。这个系统可以广泛应用于时尚设计、电子商务、虚拟试衣间等领域。以下是开发此系统的主要步骤和关键技术。北京木奇移动技术有限公司&#xff0c;专业的软件外包开…

手机录屏怎么没有声音?一键排查,轻松解决!

“手机录屏怎么没有声音&#xff1f;今天录制了一个线上的音乐会&#xff0c;结束的时候发现完全没有声音&#xff0c;我检查了手机的设置&#xff0c;录屏功能看起来是正常的&#xff0c;但为什么就是录不到声音呢&#xff1f;希望大家能帮我解答这个疑惑。” 随着智能手机的…

中电金信:从规划到落地,中电金信全程陪伴式服务助力泛金融数字化转型

在当前的全球经济和金融发展格局中&#xff0c;金融行业正经历着一场以数字化为核心的快速转型。中国银行业和保险业已经成功探索出一条数字化转型的路径&#xff0c;并积累了丰富的实践经验。然而&#xff0c;泛金融领域则仍处于数字化转型的初期阶段&#xff0c;其转型能力因…

【golang学习之旅】Go中的cron定时任务

系列文章 【golang学习之旅】报错&#xff1a;a declared but not used 【golang学习之旅】Go 的基本数据类型 【golang学习之旅】深入理解字符串string数据类型 【golang学习之旅】go mod tidy 【golang学习之旅】记录一次 panic case : reflect: reflect.Value.SetInt using…

书生·浦语大模型全链路开源体系-笔记作业2

全部写成了shell脚本&#xff0c;可以一键执行。 笔记&#xff1a; 1. 环境安装(InternStudio开发机) # 1. 创建conda环境 studio-conda -o internlm-base -t demo # 2. 激活conda环境 conda activate demo # 3. 安装额外的依赖 pip install huggingface-hub0.17.3 pip inst…

【深度学习】目标检测,Faster-RCNN算法训练,使用mmdetection训练

文章目录 资料环境数据测试 资料 https://mmdetection.readthedocs.io/zh-cn/latest/user_guides/config.html 环境 Dockerfile ARG PYTORCH"1.9.0" ARG CUDA"11.1" ARG CUDNN"8"FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}…

图片和PDF展示预览、并支持下载

需求 展示图片和PDF类型&#xff0c;并且点击图片或者PDF可以预览 第一步&#xff1a;遍历所有的图片和PDF列表 <div v-for"(data,index) in parerFont(item.fileInfo)" :key"index" class"data-list-item"><downloadCard :file-inf…

QT 信号和槽 多对一关联示例,多个信号,一个槽函数响应,多个信号源如何绑定一个槽函数

三个顾客 Anderson、Bruce、Castiel 都要订饭&#xff0c;分别对应三个按钮&#xff0c;点击一个按钮&#xff0c;就会弹出给该顾客送饭的消息。注意这个例子只使用一个槽函数&#xff0c;而三个顾客名称是不一样的&#xff0c;弹窗时显示的消息不一样&#xff0c;这需要一些 技…

EV24CXXA EEPROM 选型

如何选择一个靠谱的EEPROM? EV24C128A EV24C256A EV24C512A 是用得最多的

在哪里可以制作微信点餐功能呢

在繁忙的都市生活中&#xff0c;餐饮行业作为与人们日常生活息息相关的行业&#xff0c;其服务质量和便捷性一直备受关注。随着科技的不断发展&#xff0c;微信点餐功能以其便捷、高效的特点&#xff0c;逐渐成为了餐饮行业的新宠。今天&#xff0c;就让我们一起探讨微信点餐的…

基于SSM的“本科生毕业设计选题系统”的设计与实现(源码+数据库+文档)

基于SSM的“本科生毕业设计选题系统”的设计与实现&#xff08;源码数据库文档) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 本科生毕业设计选题系统功能结构图 系统首页界面 课题信…

「漏洞复现」用友NC pagesServlet SQL注入漏洞(XVE-2024-13067)

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

Keil编译bin格式固件方法

打开Option选项卡&#xff0c;选择User&#xff0c;在After Build/Rebuild下面增加以下命令&#xff1a; fromelf.exe --bin -o "L.bin" "#L"