当前位置: 首页 > news >正文

回调函数——qsort的模拟实现

目录

1.什么是回调函数?

2.首先介绍一下qsort函数的使用

3.使用回调函数,模拟qsort函数的实现(使用冒泡排序的方法)


1.什么是回调函数?

回调函数就是一个通过函数指针调用的函数。

当你把一个函数的指针(地址)作为参数传递给另外一个函数,当这个指针被用来调用其所指向的函数时,就称此函数为回调函数。

回调函数不是由该函数的实现方法直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应

2.首先介绍一下qsort函数的使用

#include<stdio.h>
#include<stdlib.h>
//qsort函数的使用
//qsort函数的使用者得先实现一个比较函数
int int_cmp(const void* p1, const void* p2)
{return (*(int*)p1 - *(int*)p2);
}
int main()
{int arr[] = { 5,4,6,7,2,3,1,9,8,0 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), int_cmp);for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}

3.使用回调函数,模拟qsort函数的实现(使用冒泡排序的方法)

 //qsort的模拟实现
void bubble_sort(void* base, int num, int width, int (*cmp)(const void* elem1, const void* elem2))
{int i = 0;for (i = 0; i < num - 1; i++){int j = 0;for (j = 0; j < num - 1 - i; j++){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);
}int Swap(char* buf1,char* buf2,int width)
{int i = 0;for (i = 0; i < width; i++){char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}
}
void print(int* arr, int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}
}int main()
{int arr[] = { 1,8,6,4,7,3,2,9 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);print(arr, sz);return 0;
}

相关文章:

  • 『MySQL快速上手』-③-库的操作
  • 一、Hadoop初始化配置(final+ubuntu保姆级教程)
  • 钉钉内嵌H5遇到的一些问题
  • html中使用JQ自定义锚点偏移量
  • 价钱统计
  • 数字摄影测量
  • 换服还是掀桌?哪条才是程序员的出路?
  • C++ [继承]
  • 【delphi】中 TNetHTTPClient 注意事项
  • springboot(ssm 高校教师电子名片系统 Java(codeLW)
  • 【ARM Trace32(劳特巴赫) 使用介绍 2 - Veloce 环境中使用trace32 连接 Cortex-M33】
  • C++ http协议POST body raw 字段向服务器发送请求
  • Linux Vim批量注释和自定义注释
  • flink的CoProcessFunction使用示例
  • 临界资源,临界区,通信的干扰问题(互斥),信号量(本质,上下文切换问题,原子性,自身的安全性,操作)
  • php的引用
  • 2019.2.20 c++ 知识梳理
  • Angular6错误 Service: No provider for Renderer2
  • JS实现简单的MVC模式开发小游戏
  • Laravel核心解读--Facades
  • Magento 1.x 中文订单打印乱码
  • Netty源码解析1-Buffer
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • yii2中session跨域名的问题
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 开源SQL-on-Hadoop系统一览
  • 如何设计一个比特币钱包服务
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 原生 js 实现移动端 Touch 滑动反弹
  • 自动记录MySQL慢查询快照脚本
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #微信小程序(布局、渲染层基础知识)
  • #微信小程序:微信小程序常见的配置传旨
  • (1)虚拟机的安装与使用,linux系统安装
  • (5)STL算法之复制
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (九)c52学习之旅-定时器
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)mysql使用Navicat 导出和导入数据库
  • .net wcf memory gates checking failed
  • .Net Web窗口页属性
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • @private @protected @public
  • @RequestParam详解
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [2021 蓝帽杯] One Pointer PHP
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)
  • [c#基础]DataTable的Select方法
  • [CSDN首发]鱿鱼游戏的具体玩法详细介绍
  • [DNS网络] 网页无法打开、显示不全、加载卡顿缓慢 | 解决方案