❤博主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*size,j+1下标的指针加上(j+1)*size。
对于Swap交换也是,我们怎么保证两个元素的内容彻底交换完毕呢?仔细一想,只有char*类型能够不遗漏任何一个字节。
所以参数设计的时候就直接写char*,方便后面对buf1和buf2直接进行加法运算。
最后,读者可以自行写出代码,尝试对其它数据类型进行排序。如果这篇博文对你有帮助,那么可以点个赞支持一下噢。
结语:希望读者读完有所收获!在学C的路上,祝福我们能越来越C!✔
读者对本文不理解的地方,或是发现文章在内容上有误等,请在下方评论区留言告诉博主哟~,也可以对博主提出一些文章改进的建议,感激不尽!最后的最后!
❤求点赞,求关注,你的点赞是我更新的动力,一起努力进步吧。