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

(一)冒泡排序实现对整形数组的排序

在以前,我们只会使用冒泡排序的方法对整行数组进行排序,简单的两个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[i+1])

{

tmp=arr[i];

arr[i]=arr[i+1];

arr[i+1]=tmp;

}

}

for(i=0;i<10;i++)

printf("%d  ",arr[i]);

return 0;

在此基础上我们可以使用回调函数,能够同时实现对整形数组和字符串的排序

(二)什么是回调函数

   回调函数就是一个通过函数指针(void (*perfect)(int ))调用的函数 。如果你把函数的指针(地址)作为参数传递给另一个函数void myCallback(void (*perfect)(int ),int n),当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。

通俗一点的可以这样理解,你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。回答完毕。

     为什么要使用回调函数?

  因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。

下面便是一个简单的回调函数例子,相比其他的那些复杂的代码,我觉得这个更容易理解:

#include<stdio.h>
#include<stdlib.h>
void perfect(int n)
{
 int i=1;
    int count=0;
 for(i=1;i<n;i++)
 {
    
  if(0==n%i)
  {
   count+=i;
  }
 }
 if(count==n)
  printf("%d是完数\n",n);
 else printf("%d不是完数\n",n);
}
void myCallback(void (*perfect)(int ),int n)
{
 perfect(n);
}

int main()
{
 int n;
 printf("请输入一个正整数\n");
 scanf("%d",&n);

myCallback(perfect,n);
 return 0;
 
}

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

冒泡排序可以实现对任意类型的数据进行排序,函数原型如下:

void bubble(void *base, int count, int length, int(*cmp)(const void *,const void *))

其中:

void *base:待排序数组的首地址

int count:数组中待排序元素的个数

int length:各个元素占用空间的大小

int(*cmp)(const void *,const void *):指向比较函数的指针,用于确定排序的顺序

compare的函数原型为:

int cmp_char(const void *p1,const *p2)

{

assert(p1);

assert(p2);

return strcmp((char *)(*(int *)p1), (char *)(*(int *)p2));

}

以下代码写出了字符数组和整形数组的比较函数:

#include<stdio.h>

#include<stdlib.h>

#include<assert.h>

#include<string.h>

/*整型数组比较函数*/

int cmp_int(const void *p1, const void *p2)

{

assert(p1);//检测指针的有效性

assert(p2);

//由于只要满足(*(int *)p1 > *(int *)p2))>0时才交换,其余情况都不交换

return (*(int *)p1 > *(int *)p2) ? 1 : -1;

//if (*(int *)p1 > *(int *)p2)

// return 1;

//else if (*(int *)p1 == *(int *)p2)

// return 0;

//else return -1;

}

/*字符型数组比较函数*/

int cmp_char(const void *p1,const *p2)

{

assert(p1);

assert(p2);

return strcmp((char *)(*(int *)p1), (char *)(*(int *)p2));//将p1强制类型转化为整形,然后截引用,因为进行的是字符串的比较,所以又要将它再次强制类型转化为字符类型

}

/*交换函数*/

void swap(void *p1, void *p2, int size)

{

int i = 0;

assert(p1);

assert(p2);

for (i = 0; i < size; i++)

{

char temp = *((char *)p1+i);

*((char *)p1+i) = *((char *)p2+i);

*((char *)p2+i) = temp;

}

}

/*冒泡排序*/

void bubble(void *base, int count, int length, int(*cmp)(const void *,const void *))//利用回调函数实现

{

int i = 0;

int j = 0;

assert(base);

for (i = 0; i < count-1; i++)

{

for (j = 0; j < count - i - 1; j++)

{

if (cmp((char*)base + length*j, (char*)base + length*(j + 1))>0)

swap((char*)base + length*j, (char*)base + length*(j + 1),length);

}

}

}

int main()

{

int arr[] = { 2, 3, 6, 7, 0, 9, 1, 5, 4, 8 };

char *str[] = { "cdefc", "dcbar", "aefva", "beksf","cbsle", "cdefg"};

int len = sizeof(arr) / sizeof(arr[0]);

int size = sizeof(str) / sizeof(str[0]);

int i ,j;

bubble(arr, len,sizeof(int *),cmp_int);

bubble(str, size,sizeof(char *),cmp_char);

for (i = 0; i < len; i++)

{

printf("%d ",arr[i]);

}

printf("\n");

for (j = 0; j < size; j++)

{

printf("%s\n", str[j]);

}

system("pause");

return 0;

}

时间: 2024-10-14 12:38:52

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

&lt;笔试&gt;&lt;面试&gt;编写一个排序函数,实现,既可以排序整形数组,又可以排序字符串。

思路:仿照qsort函数运用函数指针实现排序整形数组.排序字符串的功能. 首先,编写整形数组比较函数和字符串比较函数:其次,仿照qsort函数将首元素地址.元素个数.元素大小.比较函数 传参编写熟悉的冒泡排序函数:最后,举例验证函数正确性. /******************************/ //1.编写冒泡排序,可以排序整形数组,也可以排序字符串. #include<stdio.h> #include<stdlib.h> #include<assert.h&g

将回调函数作用到给定数组的单元上

-------------------------------------------------------------------------------------------------------- array array_map ( callable $callback , array $arr1 [, array $... ] ) array_map() 返回一个数组,该数组包含了 arr1 中的所有单元经过 callback 作用过之后的单元. callback 接受的参数数目应

编写冒泡排序,可以排序整形数组,也可以排序字符串

程序代码: void swap(const void * p1 , const void * p2 ,int size) { int i = 0; for (i = 0; i < size ; i++) { char temp = *((char *)p1 + i); *(( char *)p1 + i) = *((char*) p2 + i); *(( char *)p2 + i) = temp; } } void buble(void *base, int count , int size,

shell变量、函数、控制流和数组以及字符串的截取

一.变量 1.shell变量名 (1)可以由字母.数字.下划线等字符组成.但是第一个字符必须是字母或者下划线. (2)若果变量中包含下划线(_)则要特别注意,$project_svn_$date.tar.gz 和 {$project_svn}_$date.tar.gz.第一个shell理解为$project是一个变量. 2.变量的赋值: variable=value note:赋值运算符前后不能有空格,否则会报错. 3.变量分类: 内部变量是为了shell编程的而设定的变量. 本地变量是在代码块

回调函数应用 Array filter 数组过滤

Array.prototype.filter = function(fn){ for(var i =0; i < this.length; i++){ if(!fn(this[i], i)){ this.splice(i--, 1); } } return this;} var b = [1,2,3,4,5]; b.filter(function(v){ return v > 3;}); console.log(b);

使用回调函数处理数组的函数

函数的回调是PHP中的一种特殊机制,这种机制允许在函数的参数列表中,传入用户自定义的函数地址作为参数处理或完成一定的操作.使用回调函数可以很容易地显示一些所需的功能.以下将介绍主要的几个使用回调函数处理数组的函数. ①函数array_filter()array_filter函数用回调函数过滤数组中的元素,返回按用户自定义函数过滤后的新数组.该函数有两个参数,其函数的原型如下: array array_filter(array input [,callback callback]) 该函数的第一个

JavaScript中的回调函数

在学习JavaScript的过程中遇到了很多,使用到回调函数的例子,出现了许多疑问,就由一个栗子开始吧: 在JavaScript中接触的第一个回调函数是在setInterval()和setTimeout()中出现的: 1 var num = 10; 2 3 var interValId = setInterval(function (){ 4 console.log(num); 5 num--; 6 if(num==0){ 7 clearInterval(interValId); 8 } 9 }

jQuery源码研究分析学习笔记-回调函数(11)

回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应. // 工具函数,将字符串格式的标记转换为对象格式,并把转换结果缓存起来 function createFlags( flags ) { //初始化返回值object和flagsCache[flags]为空对象,同时指向了同一个空对象,当变

PHP数组和字符串相互转换以及判断字符串长度

这里只介绍最常用的方法: 1 $array=explode(separator,$string); 2 $string=implode(glue,$array); explode() 函数用来将字符串打散成数组,其中 separator 表示分隔符,即:数组值之间的字符或代码 implode() 函数用来将数组合成字符串,其中 glue 表示胶合符,即:连接数组值之间的字符或代码 1 strlen(string) strlen() 函数返回字符串的长度.