🌸🌸🌸学了qsort()之后,让排序变得非常的简单。又经过深入学习发现,用之前学的冒泡排序能够模拟实现qsort().🌸🌸🌸
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀
目录
自定义函数
首先模拟qsort(),自定义一个函数,是这个函数的参数qsort()保持一致
void buble_sort(void* base,int sz,int width,int (*cmp)(const void*e1,const void*e2))
这里也需要传入 待排序数据的第一个元素的地址,排序元素的个数,一个元素有多少个字节,自定义比较函数。
排序
然后冒泡排序实现
void buble_sort(void* base,int sz,int width,int (*cmp)(const void*e1,const void*e2))//这里的函数指针可以方便调用各种类型比较,不同类型的变量比较,可以调用不同类型的比较函数
{
int i=0,j=0;
//sz个元素就有sz-1趟
for(i=0;i<sz-1;i++)
{
for(j=0;j<sz-1-i;i++)
{
//两个元素的比较
//arr[j] arr[j+1]
if(cmp((char*)base+j*width,(char*)base+(j+1)*width)>0)
{
//交换
swap((char*)base+j*width,(char*)base+(j+1)*width,width);//然后把这个变量的地址传给交换函数
}
}
}
}
比较函数用的是整形变量的比较
int cmp_int(const void* e1,const void* e2)//对整形比较
{
return *(int*)e1-*(int*)e2;
}
疑惑
或许大家会疑惑这些代码?
if(cmp((char*)base+j*width,(char*)base+(j+1)*width)>0)
为什么将base强制转化为(char*)呢?
假如比较的是整形变量,我们将base转化为(char*),加上width(就是这里的整形变量的大小,4字节)就可以找到下个元素的地址, 字符变量也一样,加上width(就是这里的字符变量的大小,1字节),其他变量也一样,这里是为了排序各种的类型变量,达到和qsort()一样的功能。
swap((char*)base+j*width,(char*)base+(j+1)*width,width)
自定义的交换函数
void swap(char* buf1,char*buf2,int width)
{
for(int i=0;i<width;i++)
{
char temp=*buf1;
*buf1=*buf2;
*buf2=temp;
buf1++;
buf2++;
}
}
这里的交换函数交换的方法和以往的交换方法有些许不同,哪里不同呢?以前我们交换两个变量的值,只需要定义一个临时变量去实现,例如:int temp=0,a1=2,a2=3;我们交换只需要让a1=temp,a1=a2,a2=temp,这样a1和a2的值就交换了。但是这里的swap()函数的交换,不是交换的变量整个的值(这里是整形变量),也就是说不是一次性交换4个字节的内容,而是一个字节一个字节的交换。为什么这样做呢?这交换的是整形变量,万一我下次交换字符变量呢,所以我们一个字节一个字节的交换,保证能够交换其他类型变量的功能。
结果
这样我们就掌握了模拟实现qsort()的基本要点和难点,那让我们整体实践一下
#include<stdio.h>
void swap(char* buf1,char*buf2,int width)
//为什么不直接进行交换,而是交换每个字节的内容?这是因为这交换的不只是整形变量,这里还可以交换其它类型的变量
{
for(int i=0;i<width;i++)
{
char temp=*buf1;
*buf1=*buf2;
*buf2=temp;
buf1++;
buf2++;
}
}
void buble_sort(void* base,int sz,int width,int (*cmp)(const void*e1,const void*e2))//这里的函数指针可以方便调用各种类型比较,不同类型的变量比较,可以调用不同类型的比较函数
{
int i=0,j=0;
//sz个元素就有sz-1趟
for(i=0;i<sz-1;i++)
{
for(j=0;j<sz-1-i;i++)
{
//两个元素的比较
//arr[j] arr[j+1]
if(cmp((char*)base+j*width,(char*)base+(j+1)*width)>0)//为什么将base强制转化为(char*)呢?假如比较的是整形变量,我们将base转化为(char*),加上width(就是这里的整形变量的大小,4字节)就可以找到下个元素的地址,
{
//交换
swap((char*)base+j*width,(char*)base+(j+1)*width,width);//然后把这个变量的地址传给交换函数
}
}
}
}
int cmp_int(const void* e1,const void* e2)//对整形比较
{
return *(int*)e1-*(int*)e2;
}
int main()
{
int arr[10]={2,3,4,5,6,7,1,9,13,10};
int sz=sizeof(arr)/sizeof(arr[0]);
buble_sort(arr,sz,sizeof(arr[0]),cmp_int);
for(int i=0;i<sz;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
运行结果
❤️ ❤️❤️模拟实现qsort()的内容大致就是这些了,如果大家有什么问题和建议都可以发在评论区,我可以和大家一起探讨,共同学习,共同进步。🐶🐶🐶