通用版Bubble_sort

news2024/9/24 23:30:43

❤博主CSDN:啊苏要学习

  ▶专栏分类:C语言◀

  C语言的学习,是为我们今后学习其它语言打好基础,C生万物!

  开始我们的C语言之旅吧!✈

目录

前言:

一.分析Bubble_sort

二.解决措施

 三.模拟实现


前言:

  如何将冒泡排序从只排序整型到可以排序任意类型,这篇博文将给你一个答案。

一.分析Bubble_sort

void Bubble_sort(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		int j = 0;
		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;
			}
		}
	}
}

  问题一:这种实现的冒泡排序在形参部分写固定接收整型数组,只能排序整型,不能排序其它类型。

  问题二:在相邻元素的比较部分,不一定是整型进行比较,如果是字符串呢?所以比较部分要根据情况选择合适的比较方法

  问题三:相应的,如果不是整型,对于相邻元素的交换,也不能这么简单通过创建临时变量完成交换。

二.解决措施

  回想库里的qsort,数组使用了void*类型可以解决问题一,与此同时要传递元素个数元素大小作信息补充。

  问题二的解决,使用函数指针就可以解决,因为使用方知道自己要比较什么类型,让他实现比较的方法传参进来使用即可

  解决问题三另外封装一个Swap交换函数就可以了,解决了这些问题后,就可以开始实现我们的想法了。

 三.模拟实现

//元素比较方法
int cmp_int(const void* p1, const void* p2)
{
	return *(int*)p1 - *(int*)p2;
}

//元素交换,一个字节一个字节换
//一个元素有size个字节
void Swap(char* buf1, char* buf2, int size)
{
	int i = 0;
	char tmp = 0;
	for (i = 0; i < size; i++)
	{
		tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}

//base可以接收任意类型的数组
void Bubble_sort(void* base, int num, int size, int (*cmp)(const void*, const void*))
{
	int i = 0;
	for (i = 0; i < num; i++)
	{
		int j = 0;
		for (j = 0; j < num - 1 - i; j++)
		{
            //比较数组下标为j和j+1的两个元素
			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
			{
                //升序,交换的起始地址和比较的两个地址一样。
				Swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
			}
		}
	}
}

  用arr[j]和arr[j+1]来说明容易理解,现在在比较下标为j和j+1对于的两个元素,而cmp函数接收两个地址作为参数。

  base是一个void*类型,那么如何表示这两个元素的地址就需要解决,我们想到所有数据,都可以用char*+n解决;

  于是我们把base强转成char*类型j下标的元素就让指针加上一个j*sizej+1下标的指针加上(j+1)*size。    

  对于Swap交换也是,我们怎么保证两个元素的内容彻底交换完毕呢?仔细一想,只有char*类型能够不遗漏任何一个字节

  所以参数设计的时候就直接写char*,方便后面对buf1和buf2直接进行加法运算。

  

  最后,读者可以自行写出代码,尝试对其它数据类型进行排序。如果这篇博文对你有帮助,那么可以点个赞支持一下噢。

结语:希望读者读完有所收获!在学C的路上,祝福我们能越来越C!✔

  读者对本文不理解的地方,或是发现文章在内容上有误等,请在下方评论区留言告诉博主哟~,也可以对博主提出一些文章改进的建议,感激不尽!最后的最后!

  ❤求点赞,求关注,你的点赞是我更新的动力,一起努力进步吧。

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

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

相关文章

LInux的安装(VMware,网卡设置,SSH连接工具)

Linux的安装 1、安装方式介绍 1.安装方式: 物理机安装:直接将操作系统安装到服务器硬件上 虚拟机安装:通过虚拟机软件安装 **虚拟机( Virtual Machine&#xff09;**指通过软件模拟的具有完整硬件系统功能、运行在完全隔离环境中的完整计算机系统。 2、安装Linux 在官网将…

VMWare vSphere 7.0.3环境通过PowerCLI批量发布openeuler22.03LTS系统虚拟机

本文尝试在VMWare vSphere 7.0.3环境中&#xff0c;通过PowerCLI批量发布openeuler22.03LTS系统虚拟机&#xff0c;以减轻维护人员的工作量。 一、在维护机上安装PowerCLI 1、点击以下链接&#xff0c;跳转到VMWarePowerCLI官方页面 VMware PowerCLI下载链接 2、点击下载链…

【Python】simplekml如何设置样式(解决simplekml样式不生效)

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、基本样式常用 二、共享样式三、全局样式1.结果2.代码 前言 simplekml是一个用于创建kml文件的库&#xff0c;里面提供了丰富的功能和…

【编程】典型题目:寻找数组第K大数(四种方法对比)

【编程】典型题目&#xff1a;寻找数组第K大数&#xff08;四种方法对比&#xff09; 文章目录 【编程】典型题目&#xff1a;寻找数组第K大数&#xff08;四种方法对比&#xff09;1. 题目2. 题解2.1 方法一&#xff1a;全局排序&#xff08;粗暴&#xff09;2.2 方法二&#…

数据结构-链表结构-双向链表

双向链表 双向链表的定义 双向链表也叫双链表&#xff0c;与单向链表不同的是&#xff0c;每一个节点有三个区域组成&#xff1a;两个指针域&#xff0c;一个数据域 前一个指针域&#xff1a;存储前驱节点的内存地址后一个指针域&#xff1a;存储后继节点的内存地址数据域&a…

Java开发中的------修改密码+忘记密码

目录 1.修改密码 客户端响应 前端vue 后端 controller层 ServiceImpl实现层 2.忘记密码 客户端响应 后端 controller层 serviceImpl实现层 本章需要准备&#xff1a;springcloud项目&#xff0c;依赖&#xff0c;数据库.... 数据库SQL SET FOREIGN_KEY_CHECKS0;-- -…

C++设计模式之责任链设计模式

C责任链设计模式 什么是责任链设计模式 责任链设计模式是一种行为型设计模式&#xff0c;它允许多个处理请求的对象串联起来&#xff0c;形成一个处理请求的链。每个对象都有机会处理请求&#xff0c;如果该对象不能处理请求&#xff0c;则将请求传递给链中的下一个对象。 该…

Inkscape 1.3 版开放源代码 SVG 编辑器发布,新增形状生成器工具和许多更改

导读Inkscape 是功能强大的开源、跨平台、免费 SVG&#xff08;可缩放矢量图形&#xff09;编辑器&#xff0c;今天已更新到稳定的 1.3 版&#xff0c;这是一个引入新功能和许多改进的重要版本。 Inkscape 1.3 是在 Inkscape 1.2 发布一年零两个月后推出的&#xff0c;它引入了…

[pymc3][python]pymc3安装后测试代码2

测试环境&#xff1a; pymc33.11.2 代码&#xff1a; import numpy as np import pymc3 as pm import matplotlib.pyplot as pltif __name__ __main__:# 生成随机数据np.random.seed(123)x np.linspace(0, 1, 100)y 0.5 * x np.random.normal(0, 0.1, size100)# 定义概率…

C/C++算法——散列表

1、散列表介绍 散列表的英文叫Hash Table&#xff0c;我们平时也叫它哈希表或者Hash 表。散列表用的是数组支持按照下标随机访问数据的特性&#xff0c;所以散列表其实就是数组的一种扩展&#xff0c;由数组演化而来。可以说&#xff0c;如果没有数组&#xff0c;就没有散列表。…

【C++】-二叉搜索树的详解(递归和非递归版本以及巧用引用)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

JDBC案例

文章目录 案例1 &#xff1a;修改数据库中的数据案例2&#xff1a;查询数据库中的数据案例3&#xff1a;查询数据库中账户表数据&#xff0c;并将其封装成Account对象&#xff0c;&#xff0c;存储到ArrayList集合当中案例4&#xff1a;商品的增删改查1.准备环境2.查询3.添加4.…

1.微信小程序开发-快速上手

1.环境搭建 1.1 下载开发者工具 微信开发者工具下载地址与更新日志 | 微信开放文档微信开发者平台文档https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html 1.2 注册小程序 获取小程序AppId 2.小程序组件 1.view&#xff1a;用于展示视图元素&#x…

WAF绕过-权限控制篇-后门免杀

WAF绕过主要集中在信息收集&#xff0c;漏洞发现&#xff0c;漏洞利用&#xff0c;权限控制四个阶段。 1、什么是WAF&#xff1f; Web Application Firewall&#xff08;web应用防火墙&#xff09;&#xff0c;一种公认的说法是“web应用防火墙通过执行一系列针对HTTP/HTTPS的安…

所有集群启动的命令

所有集群启动的命令 查询所有节点启动Hadoop集群(Yarn模式)关闭Hadoop集群Spark&#xff08;local模式&#xff09;启动Spark集群standalone模式(不用了)关闭standalone模式HA下的standalone模式关闭HA-standalone模式Yarn模式&#xff08;重点&#xff09; 关闭Spark集群启动f…

接口/Web自动化测试如何做?框架如何搭建封装?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 自动化测试怎么做…

数据可视化(5)热力图及箱型图

1.热力图 #基本热力图 #imshow&#xff08;x&#xff09; #x&#xff0c;数据 x[[1,2],[3,4],[5,6],[7,8],[9,10]] plt.imshow(x) plt.show() #使用热力图分析学生的成绩 dfpd.read_excel(学生成绩表.xlsx) #:表示行号 截取数学到英语的列数 xdf.loc[:,"数学":英语].…

技能生态链职业技能等级评价认定业务

一、项目背景 根据《关于公布广东省2022年第一批职业技能等级认定社会培训评价组织名单的通知》&#xff08;粤人社函〔2022〕76号&#xff09;&#xff0c;广东泰迪智能科技股份有限公司于2022年入选广东省2022年第一批职业技能等级认定社会评价组织&#xff0c;并根据《关于…

《水经注地图服务》发布的影像数据如何在OsgEarth中调用

OsgEarth 是一个用于OpenSceneGraph (OSG)的可扩展地形渲染工具包&#xff0c;它是一个开源、高性能、3D 图形工具包。 只需创建一个简单的 XML 文件&#xff0c;将其指向您的图像、高程和矢量数据&#xff0c;将其加载到您最喜欢的 OSG 应用程序中&#xff0c;然后开始&#…

蓝桥云课ROS机器人旧版实验报告-05导航功能

项目名称 实验五 导航功能 成绩 内容&#xff1a;创建变换、发布传感器消息、里程数据信息、创建基础控制器、创建地图&#xff0c;机器人配置、全局和局部代价地图、rviz详细配置、自适应蒙特卡洛定位&#xff0c;避障&#xff0c;目标发送 实验记录&#xff08;70分&…