帮你理解回调函数,模拟实现库函数qsort(冒泡排序)

回调函数

回调函数就是一个通过“函数指针”调用的函数。
如果你把函数A的指针(即地址)传给一个函数B,当这个指针被用来调用其所指向的函数时,那么,这个函数A就是回调函数

是不是很绕很难以理解?没关系,我们举一个小小的例子,来帮你理解回调函数。
我们知道,有一个很方便的排序库函数qsort,我们在刷题的时候常常会用到,但实际上这个库函数,第四个调用的参数,便是回调函数的指针(即地址)。
我们从msdn中,可以看到,qsort的具体结构

void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );

第一个参数自然是数组的首地址,第二个参数是数组元素的个数,第三个参数是每个元素的大小,而第四个参数,则是一个函数指针,这个指针指向回调函数,就是回调函数。

那么qsort中回调函数的作用是什么呢?

**compare( (void ) elem1, (void ) elem2 );
The routine must compare the elements, then return one of the following values:
Return Value Description
< 0 elem1 less than elem2
0 elem1 equivalent to elem2
>0 elem1 greater than elem2

我们可以看出,函数通过判断两个参数的大小,来返回某个值,而通过判断这个值与0的关系,来进行升序或者是降序排列。

这个函数,就是回调函数!

模拟实现qsort

那么我们来模拟实现一个qsort库函数,来更好的了解回调函数。

struct school //定义一个结构体
{
	char name[20];
	int age;
	float score;
}
int main()
{
    //定义一个结构体数组,待会来对这个数组进行排序
	struct school arr[3] = { {"zhangjiang",18,78.5},{"chenggeng",17,79.8},{"songneng",20,95} };
	//计算出数组元素个数
	int len = sizeof(arr) / sizeof(arr[0]);
	//通过自己模拟实现的qsort进行排序
	my_qsort(arr, len, sizeof(arr[0]),cmp_school_age);
	return 0;
}

以上是主函数,接下来,就是模拟qsort的my_qsort函数了

void my_qsort(void *base,int *len,int *width,int(*cmp)(const void*,const void*))
{
//实现的实际上还是一个冒泡排序,所以进行两层循环
   for(int i=0;i<len-1;i++)
   {
       for(int j=0;j<len-1;j++)
       {
       //因为传入数组的首地址是无类型的,将其强转为char*类型,因为char*指针一次直能访问一个字节的地址,将1作为单位,更容易对不同类型的数据进行处理
          if(cmp((char *)base+j*width),(char *)base+(j+1)*width)>0)
          {
          //通过swap函数将其转换
             swap((char *)base+j*width,(char *)base+(j+1)*width,width);
          }
       }
   }
}
int cmp_school_age(const void *x,const void *y)//const增加鲁棒性
{
   //因为我们将结构体变量进行排序,所以我们要将无类型数据进行强转
   return (stuct school*)x->age-(stuct school*)y->age;
   //直接返回两者差值,来进行排序
}
void swap(const void *x,const void *y,int width)
{  
//因为每一次只能替换一个字节,故需要进行(数据大小)次循环
   for(int i=0;i<width;i++)
   {
      char temp=*x;
      *x=*y;
      *y=temp;
      x++;
      y++;
   }
}

以上,我们就通过冒泡排序,模拟出了qsort函数。

我们对结构体数组进行监视

在这里插入图片描述
你看,这样,这个数组就按照年龄大小升序排列了!

  • 13
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值