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

C语言 / C#改造冒泡排序函数bubble_sort()

一、仿写冒泡排序函数原型(的使用)

#include <stdio.h>
//int arr[] 实际传递的是数组首元素地址,int arr[]也可以写成 int *arr
void Sort(int arr[], int sz) 
{
	
	int i = 0;
	int count = 0;//趟数
	for (i = 0; i < sz - 1; i++)
	{
		//一趟冒泡排序,决定了一趟排序进行多少对比较
		int j = 0;
		for (j = 0; j < sz-1-i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}				
		}
		count++;		
	}
	printf("%d\n", count);
}

int main()
{
	//整型数据
	int arr[] = { 3,1,4,2,9,8,6,7,0,5 };
	//写一个函数对数组进行排序
	int sz = sizeof(arr) / sizeof(arr[0]);

	Sort(arr, sz);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}

这段代码实现整型数组冒泡排序。

Sort 函数通过两层循环,内层比较相邻元素,若顺序不对则交换,外层控制趟数,并统计趟数输出。

main 函数定义整型数组,sz计算其大小,调用 Sort 排序后打印数组。

比如:

int arr[] = { 3,1,4,2,9,8,6,7,0,5 }; , 假设j=0时,

arr[j] > arr[j + 1]      3>1?  大于则交换

二、改造冒泡排序函数bubble_sort()

//二、改造冒泡排序函数,使得这个函数可以排序任意指定的数组
 
//实现一个比较整型的函数
int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;//看返回值是 >0  <0  ==0
}
void Swap(char* buf1, char* buf2, int width)
{
	int i = 0;
	for (i = 0; i < width; i++)//eg:  比如int类型  width有4个字节,循环四次
	{
		char tmp = *buf1;//逐个字节进行地址所指向的内容的交换
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}
void bubble_sort(void* base, size_t sz, size_t width, int (*cmp)(const void* e1, const void* e2))
{
	//趟数
	size_t i = 0;
	for (i = 0; i < sz - 1; i++)//从0开始,要减1
	{
		//一趟冒泡排序的过程
		size_t j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			//↓(char*)base:起始位置,char*是说按照字节向后偏移,
			// j * width、(j + 1) * width是相对于数组起始地址base的偏移量
			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
			{
				//交换(一个字节)
				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
			}
		}
	}
}
//使用我们自己写的bubble_sort函数排序整型数组
void test3()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
int main()
{
	test3();
	return 0;
}

cmp_int 函数:
比较两个 int 值,通过 e1 减 e2 返回比较结果,用于判断大小。
 Swap 函数:
以字节为单位,交换 buf1 和 buf2 指向的 width 字节的数据。
 bubble_sort 函数:
通用冒泡排序, base 是数组起始地址, sz 为元素个数, width 是单个元素字节数, cmp 是比较函数。
两层循环实现冒泡排序,根据 cmp 结果,用 Swap 交换元素位置。
 test3 函数:
定义整型数组 arr ,计算其元素个数 sz 。
调用 bubble_sort 对 arr 排序,最后打印排序后的数组。

三、总结:

第一段代码仅针对整型数组排序, Sort 函数直接处理 int 数组,硬编码了数组类型和元素交换方式,未考虑通用性。

第二段代码通过函数指针和字节交换实现通用冒泡排序,能处理任意类型数组, bubble_sort 接受 void* 类型指针、元素个数、单个元素字节数及比较函数指针。


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

相关文章:

  • 【练习】【回溯No.1】力扣 77. 组合
  • Windows 上编译 mebedtls 的鸿蒙库
  • 毕业项目推荐:基于yolov8/yolo11的水稻叶片病害检测识别系统(python+卷积神经网络)
  • HTML Application(hta)入门教程
  • SpringBoot 整合 JPA
  • Redis-线程模型
  • SMT贴片治具关键设计要素与制造工艺探析
  • 设计模式 - 单例模式
  • AspectJ 中类型的绑定
  • 【分治法】线性时间选择问题
  • AWS - Redshift - 外部表读取 Parquet 文件中 timestamp 类型的数据
  • JavaScript函数-函数的使用
  • RNN中远距离时间步梯度消失问题及解决办法
  • 在VSCode中接入deepseek
  • 企业知识管理平台重构数字时代知识体系与智能服务网络
  • Python进行简单医学影像分析的示例
  • 工业大数据实验室解决方案
  • Eclipse2024中文汉化教程(图文版)
  • Ubuntu22 server 安装 Chrome浏览器
  • springboot多实例部署时,@Scheduled注释的方法重复执行