用回调函数实现冒泡排序
来源:互联网 发布:淘宝怎么开通蚂蚁花呗 编辑:程序博客网 时间:2024/05/18 20:34
(一)什么是回调函数呢?
答:回调函数就是通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。
(二)回调函数的实现机制
1.定义一个回调函数
2.提供函数实现的一方在初始化时。将回调函数的函数指针注册给调用者。
3.当特定的条件发生时,调用者使用函数指针调用回调函数对事件进行处理。
(三)回调函数的使用原因
通过回调函数,可以将调用者与被调用者分开。
可能你不知道,在库函数中有一个qsort函数,即我们通常说的快速排序,让我们看它是如何调用和实现的。
原型:void qsort( void *base, size_t num, size_t width,
int (__cdecl *compare ) (const void *elem1, const void *elem2 ) )
base:目标数组的首位置
num:元素个数
width:每个元素所占字节数
compare:函数指针,指向一个比较函数
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<string.h> int compare_int(const void *elem1,const void *elem2)//排序整型数组 { return *(int *)elem1-*(int *)elem2; } int compare_float(const void *elem1,const void *elem2)//排序浮点型数组 { if((*(float *)elem1)-(*(float *)elem2) > 0)//不可以直接返回二者的差,\ 转化为整型时可能漏掉部分数据 return 1; else if((*(float *)elem1)-(*(float *)elem2) == 0) return 0; else return -1; } int compare_string(const void *elem1,const void *elem2)、 { return strcmp(*(char **)elem1,*(char **)elem2);//应先找到每个字符串\ 的首地址再进行解引用 } void print_int_arr(int arr[],int sz) { int i = 0; for(i=0; i<sz; i++) { printf("%d ",arr[i]); } printf("\n"); } void print_float_arr(float arr[],int sz) { int i = 0; for(i=0; i<sz; i++) { printf("%f ",arr[i]); } printf("\n"); } void print_string_arr(char **arr,int sz) { int i = 0; for(i=0; i<sz; i++) { printf("%s ",arr[i]); } printf("\n"); } int main() { int arr1[]={2,4,6,8,0,1,3,5,7,9}; int sz1 = sizeof(arr1)/sizeof(arr1[0]); float arr2[]={2.0f,4.4f,6.5f,8.3f,0.0f,1.2f,3.7f,5.6f,7.9f,9.8f}; int sz2 = sizeof(arr2)/sizeof(arr2[0]); char *arr3[]={"abcd", "bbdd", "aabc", "dfer","dghjf"}; int sz3 = sizeof(arr3)/sizeof(arr3[0]); qsort(arr1,sz1,sizeof(int),compare_int); qsort(arr2,sz2,sizeof(int),compare_float); qsort(arr3,sz3,sizeof(int),&compare_string); print_int_arr(arr1,sz1); print_float_arr(arr2,sz2); print_string_arr(arr3,sz3); system("pause"); return 0; }
程序运行结果:
是的,你没看错,通过回调函数,我们同时排序了不同类型的数组元素,是不是很方便呢,同时让程序也更灵活了。
通过上面的调用和部分实现,让我们来一起模拟一个通过回调函数实现冒泡排序的算法吧!
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<string.h> int compare_int(const void *elem1,const void *elem2) { return *(int *)elem1-*(int *)elem2; } int compare_float(const void *elem1,const void *elem2) { if((*(float *)elem1)-(*(float *)elem2) > 0)//不可以直接返回二者的差,\ //转化为整型时可能漏掉部分数据 return 1; else if((*(float *)elem1)-(*(float *)elem2) == 0) return 0; else return -1; } int compare_double(const void *elem1,const void *elem2) { if((*(double *)elem1)-(*(double *)elem2) > 0)//不可以直接返回二者的差,\ //转化为整型时可能漏掉部分数据 return 1; else if((*(double *)elem1)-(*(double *)elem2) == 0) return 0; else return -1; } int compare_char(const void *elem1,const void *elem2) { return *(char *)elem1-*(char *)elem2;//应先找到每个字符串\ // 的首地址再进行解引用 } int compare_string(const void *elem1,const void *elem2) { return strcmp(*(char **)elem1,*(char **)elem2);//应先找到每个字符串\ // 的首地址再进行解引用 } void Swap(size_t width,void *n1,void *n2) { char tmp = 0; size_t i = 0; for(i=0; i<width; i++) { tmp=*((char *)n1+i); *((char *)n1+i)=*((char *)n2+i); *((char *)n2+i)=tmp; } } void bubble_sort(void *base,size_t sz,size_t width, int (*compare)(const void*,const void*)) { size_t i = 0; size_t j = 0; for(i=0; i<sz-1; i++) { for(j=0; j<sz-1-i; j++) { <span style="color:#ff0000;">if(compare(((char*)base+j*width),((char *)base+(j+1)*width))>0)//升序 //if(compare((char *)base+j*width),(char *)base+(j+1)*width)>0)//降序 Swap(width,((char *)base+j*width),((char *)base+(j+1)*width));</span> } } } void print_int_arr(int arr[],int sz) { int i = 0; for(i=0; i<sz; i++) { printf("%d ",arr[i]); } printf("\n"); } void print_float_arr(float arr[],int sz) { int i = 0; for(i=0; i<sz; i++) { printf("%f ",arr[i]); } printf("\n"); } void print_double_arr(double arr[],int sz) { int i = 0; for(i=0; i<sz; i++) { printf("%lf ",arr[i]); } printf("\n"); } void print_char_arr(char arr[],int sz) { int i = 0; for(i=0; i<sz; i++) { printf("%c ",arr[i]); } printf("\n"); } void print_string_arr(char *arr[],int sz) { int i = 0; for(i=0; i<sz; i++) { printf("%s ",arr[i]); } printf("\n"); } int main() { int arr1[]={2,4,6,8,0,1,3,5,7,9}; int sz1 = sizeof(arr1)/sizeof(arr1[0]); float arr2[]={2.0f,4.4f,6.5f,8.3f,0.0f,1.2f,3.7f,5.6f,7.9f,9.8f}; int sz2 = sizeof(arr2)/sizeof(arr2[0]); double arr3[]={1.1,2.4,3.5,4.6,7.8,9.0}; int sz3 = sizeof(arr3)/sizeof(arr3[0]); char arr4[]={'d','f','b','c','e','g','h','a'}; int sz4 = sizeof(arr4)/sizeof(arr4[0]); char *arr5[]={"abcd", "bbdd", "aabc", "dfer","dghjf"}; int sz5 = sizeof(arr5)/sizeof(arr5[0]); bubble_sort(arr1,sz1,sizeof(int),compare_int); bubble_sort(arr2,sz2,sizeof(float),compare_float); bubble_sort(arr3,sz3,sizeof(double),compare_double); bubble_sort(arr4,sz4,sizeof(char),compare_char); bubble_sort(arr5,sz5,sizeof(char *),compare_string); print_int_arr(arr1,sz1); print_float_arr(arr2,sz2); print_double_arr(arr3,sz3); print_char_arr(arr4,sz4); print_string_arr(arr5,sz5); system("pause"); return 0; }
各种类型的数据都可调用一个函数来排序了,怎么样,你学会了吗?
阅读全文
0 0
- 用回调函数实现冒泡排序
- 用回调函数实现冒泡排序
- 回调函数实现冒泡排序
- 回调函数实现冒泡排序
- 回调函数实现通用冒泡排序
- 【C语言】 使用回调函数实现冒泡排序
- 回调函数实现冒泡法的多种排序
- 利用回调函数实现通用冒泡排序
- 使用回调函数实现qsort(冒泡排序)
- 冒泡排序之回调函数!
- 通用冒泡排序(回调函数)
- 使用回调函数实现一个通用的冒泡排序,可以排序不同的数据类型。
- 通过冒泡排序(C语言实现)学习回调函数设计原理
- C语言冒泡排序之回调函数设计
- 【C语言】使用回调函数实现一个通用的冒泡排序,可以排序不同的数据类型。
- 通过冒泡排序的快速排序练习使用回调函数
- 回调函数实现
- 回调函数应用(冒泡排序 既排整型数组 也可排字符串 )
- redis介绍及安装及redis 集群
- 刷清橙OJ--A1077.坐标排序
- jQuery
- 访问国外网站跳转到CJB的解决办法
- Linux基础(二)
- 用回调函数实现冒泡排序
- 文件路径
- 2017.6.19c++
- 十大 Node.js 的 Web 框架
- 在JavaScript中想让一个函数执行完毕之后再执行下一个函数?
- 常用的数据结构的增删代码-c语言
- 腾----讯----面----试1
- for循环1-性能
- php小知识点类型转换