回调函数( qsort函数为例)

1.回调函数:回调函数就是一个通过函数指针调用的函数。
如果你把函数的指针(地址)作为参数传递给另一个函数,
当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
回调函数不是直接由该函数的实现方直接调用,
而是在特定的事件或条件时由另外的一方调用,
用来对该事件或条件进行响应
2.qsort函数(基于任意类型数据排序的函数):

void qsort(void* base,size_t num,size_t size,
           int(*compar)(const void*,const void*);
   //void* base:数据的起始地址
   //size_t num:整个序列的总元素个数
   //size_t size:每个元素的大小
   // int(*compar)(const void*,const void*)
   //比较函数(成为回调函数) 返回值-1,1,0
   //(const void*,const void*)任意两个元素的地址

3.用qsort函数排序的实例(采用冒泡排序)

#include<stdio.h>
#include<windows.h>
int cmp_int(const void*xp, const void*yp)
{
 const int*_xp = (const int*)xp;
 const int*_yp = (const int*)yp;
 if (*_xp > *_yp)
  return 1;//return -1-->降序
 else if (*_xp < *_yp)
  return -1;//return 1
 else 
  return 0;
}
int main()
{
 int a[] = { 2, 34, 56, 78, 243, 436, 23456, -1, 35, 3425 };
 //如果想比较浮点函数,把int改为folat即可。
 int num = sizeof(a) / sizeof(a[0]);

 qsort(a, num, sizeof(int), cmp_int);
 
 int i = 0;
 for (; i < num; i++)
 {
  printf("%d ", a[i]);
 }
 printf("\n");
 system("pause");
 return 0;
}

4.使用回调函数,模拟实现去sort(采用冒泡排序)

int cmp_float(const void*xp, const void*yp)//不能直接比较浮点数是否相等,有精度问题
{
 const float*_xp = (const float*)xp;
 const float*_yp = (const float*)yp;
 if (*_xp > *_yp)
  return 1;//return -1-->降序
 else if (*_xp < *_yp)
  return -1;//return 1
 else
  return 0;
}


void swap(char *x, char *y, int size)//交换size个字节
{
 while (size--)
 {
  *x ^= *y;
  *y ^= *x;
  *x ^= *y;
  x++; y++;
 }
}

typedef int(*cmp_t)(const void*, const void *);//函数说明
void my_qsort(void *base, int num, int size, cmp_t cmp)
{
 int i = 0;
 char *_base = (char*)base;//通过char交换一个字节
 for (; i < num - 1; i++)
 {
  int j = 0;
  int flag = 0;
  for (; j <num-1-i; j++)//最后的元素已经排好
  {
   if (cmp(_base+j*size,_base+(j+1)*size)>0)//cmp函数传地址
   {
    flag = 1;
    swap(_base + j*size, _base + (j + 1)*size,size);//交换字节
   }
   if (flag == 0)//数据本身是有序的
   {
    break;
   }
  }
 }
}
int main()
{
 float a[] = { 2.3, 45.6, 67.7, -1, -2.6, -1.2 };
 int num = sizeof(a) / sizeof(a[0]);
//qsort(a, num, sizeof(float), cmp_float); 
 my_qsort(a, num, sizeof(float), cmp_float);
 int i = 0;
 for (; i < num; i++)
 {
  //printf("%d ", a[i]);
  printf("%f ", a[i]);
 }
 printf("\n");
 system("pause");
 return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值