冒泡排序之回调函数!

前天,鹏哥上课的时候给我们讲了回调函数。虽然他噼里啪啦讲了一大堆,然而我还是听得云里雾里。。(不是我们鹏哥讲的不好啦,O(∩_∩)O哈哈~)

最重要的是 回调函数是什么,什么是回调函数。我不知道它是干什么的,我当然不会写他了。所以我就各种百度,谷歌。

接下来,我就用我的话给你们讲一下 什么是回调函数。。。。。

什么是回调函数(callback)

回调函数是程序上的概念。本质是叫别人做事,自己穿进去额外的信息。

函数A调用函数B

比如A叫B做事,当B在做这件事的时候,自身需要的信息不够,而A又有。就需要A从外面传进来,或者B做着做着主动向外面申请。对于B来说,一种被动得到消息,一种主动得到消息。有人给这两种方式的术语,叫信息的push,和信息的pull。

再举个生动点的例子。

你有一个任务,但是有一部分你不会做,或者说不愿做,所以我来帮你做这部分,你做你其它的任务工作或者等着我的消息,但是当我完成的时候我要通知你我做好了,你可以用了,我怎么通知你呢?你给我一部手机,让我做完后给你打电话,我就打给你了,你拿到我的成果加到你的工作中,继续完成其它的工作.这就叫回叫,手机是我通知你的手段,它就是回叫函数,也叫回调函数.

回调函数的简单使用

使用冒泡排序可以排字符串,整形

函数如下:

实际中,为了方便通常会重命名

typedef	 int(*Cmp)(const void *elem1, const void *elem2);

交换函数:

不管是排哪种类型,我们在排序的时候总会把两个元素交换,所以我们应该先有一个交换函数。

void swap(char *p1, char *p2, int size)//在这以char为单位,在整形交换和字符串交换的时候就                                       //都可以用了
{
	int i = 0;
	char tmp = 0;
	for (i = 0; i < size; i++)
	{
		tmp = *(p1 + i);
		*(p1 + i) = *(p2 + i);
		*(p2 + i) = tmp;
	}
}

比较整数的回调函数:

int compare_int(const void *elem1, const void *elem2)
{
	int a = *(int *)elem1;
	int b = *(int *)elem2;
	return a - b;
}

比较字符串的回调函数:

int compare_str(const void *elem1, const void *elem2)
{
	char a = *(char *)*(int *)elem1;
	char b = *(char *)*(int *)elem2;
	return a - b;
}

冒泡排序:

void bubble_sort(void *arr, int n,int size,Cmp cmp)
{
    assert(arr);
    int i = 0;
    int j = 0;
    for (i = 0; i < n - 1; i++)
    {
      for (j = 0; j < n - 1 - i; j++)
	{
           if (cmp(((char *)arr + j*size), ((char *)arr + (j + 1)*size)) > 0)
	     {
	         swap(((char *)arr + j*size), ((char *)arr + (j + 1)*size), size);
	     }
        }
    }
}

主函数:

int main()
{
	char *str[] = { "bsjdfvgn", "aaaaaa", "fghgjj", "mniig" };
	int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
	int i = 0;
	int n_int = sizeof(arr) / sizeof(arr[0]);
	int n_str = sizeof(str) / sizeof(str[0]);
	bubble_sort(str, n_str, sizeof(str[0]), compare_str);
	printf("bubble_sort str in:\n");
	for (i = 0; i < n_str; i++)
	{
		printf("%s ", str[i]);
	}
	printf("\n");
	bubble_sort(arr, n_int, sizeof(arr[0]), compare_int);
	printf("bubble_sort int in:\n");
	for (i = 0; i < n_int; i++)
	{
		printf("%d ", arr[i]);
	}
	system("pause");
	return 0;
}

注:主要思想:排序的是什么元素都将其强制类型转换成(char*),因为可以把char当作一个基类。然后再根据排序元素的类型,将其强制类型转化成目标类型.

例如:

int compare_int(const void *elem1, const void *elem2)
{
	int a = *(int *)elem1;
	int b = *(int *)elem2;
	return a - b;
}

把基类强制类型转换成int*再*就得到int类型的数据。字符串比较函数也是如此。

时间: 2024-08-27 19:59:56

冒泡排序之回调函数!的相关文章

回调函数实现冒泡排序

 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.         在C语言库中,有这个函数qsort() 定义在头文件:#include <stdlib.h>    它接收四个参数:             void qsort( void *base,                                  size_t num,                        

Javascript-回调函数浅谈

回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应. 中文名 回调函数 外文名 Callback Functions 意思 通过函数指针调用的函数 作用 对特定的事件或条件进行响应 机制 听语音 ⑴定义一个回调函数: ⑵提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者

C语言之回调函数

想要全面的了解一个概念,必须至少了解它的三点:它是什么.它有什么用.它在什么时候用.对于回调函数,同样从三个方面了解它. 1.什么是回调函数? 2.回调函数该如何使用? 3.回调函数在什么情况下使用? 答案一: 回调函数:见名知意,首先肯定的一点是它是一个函数,修饰词回调指的是程序员自己定义一个函数并实现它的程序内容,然后把这个函数的指针作为参数传递给其他函数(如系统函数)中,由其他函数(如系统函数)在运行时调用所实现的函数.函数是程序员自己实现的,但却是由其他函数(如系统函数)在运行时通过参数

函数指针,回调函数的定义和使用

一.函数指针 定义:函数指针是指向函数的指针变量,即本质是一个指针变量. int (*f) (int x); /* 声明一个函数指针 */ f=func; /* 将func函数的首地址赋给指针f */ 指向函数的指针包含了函数的地址,可以通过它来调用函数.声明格式如下:  类型说明符 (*函数名)(参数)其实这里不能称为函数名,应该叫做指针的变量名.这个特殊的指针指向一个返回整型值的函数.指针的声明笔削和它指向函数的声明保持一致.指针名和指针运算符外面的括号改变了默认的运算符优先级.如果没有圆括

了解java回调函数

在计算机程序设计中,回调函数,或简称回调(Callback 即call then back 被主函数调用运算后会返回主函数),是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序.(维基百科) C的回调 在C/C++中,回调函数是一个通过函数指针调用的函数,当你把函数的指针作为参数传递给另外一个函数.当这个指针被用来调用其所指向的函数时,我们称这样的函数为回调函数. 实用情况举例: 1. 假设要编写一个库,其中提供了某些排序算法.(如冒泡排序,快

java 之回调函数 rollback

之前对回调函数不是很理解,经同事提醒,恍然大悟. 今天我们就从冒泡排序开始说起,冒泡排序大家应该都知道,所有接触过编程语言的,所知道的第一个排序应该都是它. //冒泡排序 private static void sort(int[] a,Comparator comparator)  {      for(int i=0;i<a.length;i++)      {               for(int j=0;j<a.length-i-1;j++)           {       

回调函数实现对整形数组和字符串的排序

(一)冒泡排序实现对整形数组的排序 在以前,我们只会使用冒泡排序的方法对整行数组进行排序,简单的两个for循环,外层循环控制循环次数,内层循环控制比较次数,就像下面代码,便可实现: #include<stdio.h> int main() { int arr[10]={11,9,8,7,6,5,4,3,2,1}; int i=0; int j=0; int tmp=0; for(j=0;j<10;j++) { for(i=0;i<10-j;i++) if(arr[i]>arr

回调函数和钩子函数

什么是回调函数? 简而言之,回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数. 为什么要使用回调函数? 因为可以把调用者与被调用者分开.调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型.某些限制条件(如返回值为 int )的被调用函数. 如果想知道回调函数在实际中有什么作用,先假设有这样一种情况,我们要编写一个库,它提供了某些排序算法的实现,如冒泡排序.快速排序. shel

回调函数、Java接口回调 总结

回调函数 谈到回调,我们得先从回调函数说起,什么叫回调函数呢? 回调函数是什么?    百度百科的解释:回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外一方调用的,用于对该事件或条件进行响应.    接着,我们从下图简单说明一下回调函数.    已知图形上面三种模块,此时标号2能称为回调函数吗? 答案:不能,只有当标号2函