首页 > 代码库 > 再议指针---------函数回调(qsort函数原理)

再议指针---------函数回调(qsort函数原理)

   
  我们能否写一个这样的函数:
  可以对任何类型数据排序
  任何人在使用该函数不需要修改该函数代码(即:用户可以不必看到函数源		 码,只会调用就行)
  思考:
  用户需要排序的数据的类型千变万化,可能是int型,也有可能是自定义的结构体类型,各种类型的大小比较规则是不一样的,这样看来实现一个这样全能的排序函数似乎不可能。
  但具体需要排序的类型应按照什么规则确定大小只有使用该函数的用户最清楚,那我们可不可以把实现比较大小的功能交给用户来完成了,到时候用户只需告诉该函数比较规则(函数)在什么位置,这样排序函数不就可以知道数据大小的比较规则了嘛!排序功能也就可以实现了。
  
  
  
  那具体应该怎样实现这个函数呢?
  我们知道函数是有地址的,只要让用户把大小比较规则写到一个独立的函数中,然后把该函数的地址传给排序函数就可以了。
  
  下面的compare变量就是用来接收用户定义的大小比较规则函数地址
  //假设需要排序的数据放在了int型数组中
  int sort(int* arr,int (*  compare)(const void* a,const void* b))
  {
		int result = compare(arr,arr+1);//调用用户定义的大小比较函数得到谁大谁小

  //.....具体排序过程省略...........//
  }
  
  用户只需要写一个这样的函数就可以了
  int comp(const void* a,const void* b)
  {
  //先强制转换类型,此处假设需要比较的数据类型为int型,当然需要比较结构体	//大小时要先转换成对应的结构体类型,然后再根据结构体中某些变量确定谁大谁	//小
  	int* aa=(int*)a;
  	int * bb=(int*)b;
  	return *aa>*bb?1:-1;
  }
  
  
  然后用户调用
  sort(arr,comp);就可以了//假设需要排序的数据放在了int型arr数组中
  
  到现在为止,我们已经实现了这个全能的排序函数,其实c++库中的qsort就是这样实现的,不光是c++,其实java也有类似的实现方式,比如java中添加监听器时经常要传入一个对象,其实是为了得到这个对象的引用,然后调用我们实现的对象中的方法(通过多态实现)(具体事例详见本博客排列组合java源代码及jar包  http://blog.csdn.net/qingchunweiliang/article/details/26464479)