装企工长网站开发,上海千途网站建设,成都网站优化实战,北京网站建设设计公司浩森宇特❤博主CSDN:啊苏要学习 ▶专栏分类#xff1a;C语言◀ C语言的学习#xff0c;是为我们今后学习其它语言打好基础#xff0c;C生万物#xff01; 开始我们的C语言之旅吧#xff01;✈ 目录
前言#xff1a;
一.分析Bubble_sort
二.解决措施 三.模拟实现 前言#xff… ❤博主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和j1的两个元素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[j1]来说明容易理解现在在比较下标为j和j1对于的两个元素而cmp函数接收两个地址作为参数。 base是一个void*类型那么如何表示这两个元素的地址就需要解决我们想到所有数据都可以用char*n解决 于是我们把base强转成char*类型j下标的元素就让指针加上一个j*sizej1下标的指针加上j1*size。 对于Swap交换也是我们怎么保证两个元素的内容彻底交换完毕呢仔细一想只有char*类型能够不遗漏任何一个字节。 所以参数设计的时候就直接写char*方便后面对buf1和buf2直接进行加法运算。 最后读者可以自行写出代码尝试对其它数据类型进行排序。如果这篇博文对你有帮助那么可以点个赞支持一下噢。 结语希望读者读完有所收获在学C的路上祝福我们能越来越C!✔ 读者对本文不理解的地方或是发现文章在内容上有误等请在下方评论区留言告诉博主哟~也可以对博主提出一些文章改进的建议感激不尽最后的最后 ❤求点赞求关注你的点赞是我更新的动力一起努力进步吧。