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

通用型函数——冒泡排序

对于一般类型数据冒泡排序

(int 、double 、char 、flort)

代码:(int型)

void bubble_sort(int* arr){
	int len=sizeof(arr)/sizeof(int);
	int temp=0;
	for(int i=0;i<len-1;i++){
		for(int j=0;j<(len-i-1);j++){
			if(arr[j]<arr[j+1]){
				temp=arr[j];
				arr[j]=arr[i];
				arr[i]=temp;
			}
		}
	}
}

代码:(double型)

void bubble_sort(double* arr){
	int len=sizeof(arr)/sizeof(double);
	double temp=0;
	for(int i=0;i<len-1;i++){
		for(int j=0;j<(len-i-1);j++){
			if(arr[j]<arr[j+1]){
				temp=arr[j];
				arr[j]=arr[i];
				arr[i]=temp;
			}
		}
	}
}

 代码:(char型)

void bubble_sort(char* arr){
	int len=sizeof(arr)/sizeof(char);
	char temp=0;
	for(int i=0;i<len-1;i++){
		for(int j=0;j<(len-i-1);j++){
			if(arr[j]<arr[j+1]){
				temp=arr[j];
				arr[j]=arr[i];
				arr[i]=temp;
			}
		}
	}
}

由上述代码发现,如果要编写通用型冒泡函数,我们需要解决以下问题:

  • 传入排序数据的数据类型无法做到统一;
  • 数据中转变量temp需要根据数据转换成相应的数据类型,以方便数据转换;
  • 判断语句 if() 中数据中元素的比较无法统一比较方法;

 通用型冒泡排序函数的演变过程

解决方法及代码实现:

//对于if()中的比较,直接自己编写比较函数,冒泡排序函数预留比较函数的形参位置即可;
//eg;int((*comp)(*void,*void))

int comp_int(void* a,void* b){
	return *(int*)a - *(int*)b;
}

int comp_double(void* a,void* b){
	return *(double*)a - *(double*)b;
}

//对于数据类型,直接用void*arr代替即可;
//对于数据转换,直接使用memcpy,以及各种数据类型的字节大小传入即可;

void bubble_sort(void* arr,int len,int size,int(*comp)(void*,void*)){
	char temp[size];
	memset(temp,0,size);
	for(int i=0;i<len-1;i++){
		for(int j=0;j<len-i-1;j++){
			if(         comp(arr+j*size,arr+(j+1)*size) < 0           ){
			//	temp = arr[j];
			//	arr[j] = arr[j+1];
			//	arr[j+1] = temp; 
				memcpy(temp,arr+j*size,size);
				memcpy(arr+j*size,arr+(j+1)*size,size);
				memcpy(arr+(j+1)*size,temp,size);
			}
		}
	}
}

memcpy函数

        函数原型:

                void *memcpy(void *dest, const void *src, size_t n);

        功能:

                memcpy函数用于将指定数量的字节从源内存地址(src)复制到目标内存地址(dest)。

        参数说明:

                n : 要复制的字节数,类型为size_t表示要复制的字节的数量。

 注意:

        计算机中,任何数据最终都是二进制数,故只需有足够的空间,就可以将任何数据存储起来,相应的,读取时使用数据类型容器识别就可还原原本的意思。


http://www.kler.cn/a/377446.html

相关文章:

  • 基于 JavaWeb 的宠物商城系统(附源码,文档)
  • Unity XR Interaction Toolkit 开发教程(3)快速配置交互:移动、抓取、UI交互【3.0以上版本】
  • 金华迪加 现场大屏互动系统 mobile.do.php 任意文件上传漏洞复现
  • 双指针算法篇——一快一慢须臾之间解决问题的飘逸与灵动(2)
  • 关于git命令
  • 程序员也要认识下“信创产业”
  • 商务英语学习柯桥学外语到泓畅-老外说“go easy on me”是什么意思?
  • spring-解析Scope注解
  • golang switch v := data.(type)
  • Flarum:简洁而强大的开源论坛软件
  • 活动回顾丨艾体宝《开源软件供应链安全的最佳实践》线下研讨会圆满落幕!
  • 五、SpringBoot3实战(1)
  • docker对nginx.conf进行修改后页面无变化或页面报错
  • 【运动的&足球】足球场地区域图像分割系统源码&数据集全套:改进yolo11-RFAConv
  • 提高交换网络可靠性之端口安全配置
  • 项目自动化构建工具——make与Makefile详解
  • 高效实现SCRM用户管理的最佳实践与策略
  • DB-GPT系列(三):底层大模型设置(开源模型、在线模型)
  • 景联文科技医疗数据处理平台:强化医疗数据标注与管理,推动医疗数字化新篇章
  • Waymo的EMMA给多模态端到端自驾指引了方向
  • 软件(2)
  • Rust 力扣 - 73. 矩阵置零
  • gazebo仿真初学者可以试试这个ros小车
  • 我开源了一个短视频应用(Go+React)|DouTok2.0 项目介绍
  • Golang | Leetcode Golang题解之第528题按权重随机选择
  • springcloud整合sentinel,限流策略持久化到nacos,详细配置案例