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

冒泡排序及回调函数的使用

回调函数的特点:函数的调用者不知道具体的调用时机,由操作系统或代码框架来决定
这样的好处就是可以将有些特定的逻辑单独提取出来,让调用者插入一些自定制的代码
我们先来写一个冒泡排序
 1 #include<stdio.h>
 2 void Swap(int* num1, int* num2)
 3 {
 4  int temp = 0;
 5  temp = *num1;
 6  *num1 = *num2;
 7  *num2 = temp;
 8 }
 9 void BubbleSort(int arr[], int size)
10 {
11  //在这里设置一个边框
12  //[0,bound]已排序区间
13  //[bound,size]未排序区间
14  int bound = 0;
15  //第一遍循环的目的是将最小值放在最前面,依次将较小值排列
16  for (; bound < size; bound++)
17  {
18   //进行升序排序从数组的末尾开始比较
19   for (int cur = size - 1; cur > bound; --cur)
20   {
21    //如果前一个元素大于后一个元素则交换位置
22    if (arr[cur - 1] > arr[cur])
23    {
24     Swap(&arr[cur - 1], &arr[cur]);
25    }
26   } 
27  }
28 }
29 int main()
30 {
31  int arr[] = { 9,3,5,2,1,6,7 };
32  int size = sizeof(arr)/sizeof(arr[0]);
33  BubbleSort(arr, size);
34  for (int i = 0; i < size; i++)
35  {
36   printf("%d",arr[i]);
37  }
38  return 0;
39 }

 

在这个冒泡排序中只可以选择升序排序或者降序排序,如果是两个都需,则还需要
在写一个函数来实现,就显得过于麻烦,在这里就体现出了回调函数的用途。
可以将程序改为如下:
 
 1 #include<stdio.h>
 2 typedef int (*Comp)(int a, int b);
 3 void Swap(int* num1, int* num2)
 4 {
 5  int temp = 0;
 6  temp = *num1;
 7  *num1 = *num2;
 8  *num2 = temp;
 9 }
10 void BubbleSort(int arr[], int size,Comp cmp)
11 {
12  //在这里设置一个边框
13  //[0,bound]已排序区间
14  //[bound,size]未排序区间
15  int bound = 0;
16  for (; bound < size; bound++)
17  {
18   //从数组的末尾开始比较
19   for (int cur = size - 1; cur > bound; --cur)
20   {
21    if (cmp(arr[cur] , arr[cur-1]))
22    {
23     Swap(&arr[cur - 1], &arr[cur]);
24    }
25   }
26  }
27 }
28 //升序排序
29 int less(int a, int b)
30 {
31  return a < b ? 1 : 0;
32 }
33 //降序排序
34 int Greater(int a, int b)
35 {
36  return a > b ? 1 : 0;
37 }
38 int main()
39 {
40  int arr[] = { 6,2,4,1,7,8,5 };
41  int size = sizeof(arr) / sizeof(arr[0]);
42  //这里想要进行升序排序的时候可以直接调用less
43  BubbleSort(arr, size, less);
44  for (int i = 0; i < size; i++)
45  {
46   printf("%d", arr[i]);
47  }
48  printf("\n");
49  //想要进行降序排序的时候可以直接调用Greater
50  BubbleSort(arr, size, Greater);
51  for (int i = 0; i < size; i++)
52  {
53   printf("%d", arr[i]);
54  }
55  return 0;
56 }

 

转载于:https://www.cnblogs.com/cuckoo-/p/10466605.html

相关文章:

  • HTML5基础(四)
  • 决战燕京城-10 前往天寿山
  • ubuntu设置源
  • 据Progress调查:2018年,70%的客户在使用NoSQL
  • PopupWindow
  • mysqldump的实现原理
  • containerd正式从CNCF毕业!
  • java动态代理(JDK和cglib)
  • 巧用年线抓长线牛股的四种经典技巧
  • 说说spring注解
  • 爬虫入门(四)
  • CSS3D效果
  • 诈欺猎物160万+,同盾科技、猛犸等诈欺猎人们的反击战
  • µWebSockets:一种WebSocket服务器实现
  • 瞬间移动(组合数, 逆元)
  • Elasticsearch 参考指南(升级前重新索引)
  • ES6系列(二)变量的解构赋值
  • JDK 6和JDK 7中的substring()方法
  • Kibana配置logstash,报表一体化
  • Vim 折腾记
  • Vue全家桶实现一个Web App
  • 笨办法学C 练习34:动态数组
  • 基于游标的分页接口实现
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 目录与文件属性:编写ls
  • 入门到放弃node系列之Hello Word篇
  • 我与Jetbrains的这些年
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 正则表达式小结
  • 《码出高效》学习笔记与书中错误记录
  • NLPIR智能语义技术让大数据挖掘更简单
  • 函数计算新功能-----支持C#函数
  • #pragma multi_compile #pragma shader_feature
  • #Z2294. 打印树的直径
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (1)Nginx简介和安装教程
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (30)数组元素和与数字和的绝对差
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (HAL库版)freeRTOS移植STMF103
  • (pojstep1.1.2)2654(直叙式模拟)
  • (算法)前K大的和
  • (算法二)滑动窗口
  • (一)kafka实战——kafka源码编译启动
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .Net - 类的介绍
  • .NET 的程序集加载上下文
  • .NET的数据绑定
  • .net对接阿里云CSB服务
  • .NET中使用Protobuffer 实现序列化和反序列化
  • [04]Web前端进阶—JS伪数组
  • [ACTF2020 新生赛]Include
  • [Apio2012]dispatching 左偏树
  • [AutoSar]BSW_Com02 PDU详解