通用版Bubble_sort

❤博主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!✔

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

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

  • 17
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊苏要学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值