在初学写程序时,特别是刚开始接触数据结构时,基本都是在查找;

各种排序,其实都是在为查找做准备。

=============================

今天我们来看看关于c语言中自带的一个二分法搜索函数bsearch

通过这个函数可以简单的认识到二分法搜索的一些内在的原理,以及发散一点其他搜索方法的东西。

=============================

首先,介绍这个函数

函数原型:

 

 
  
  1. void *bsearch(const void *key, const void *base, size_t *nelem,  
  2. size_t width, int(*fcmp)(const void *, const *)) 

头文件:#include<stdlib.h>
参数介绍:
参数key指向要查找的关键字的指针;
base指向从小到大的次序存放元素的查找表;
nelem指定查找表元素的个数;
width指定查找表中每个元素的字节数;
int(*fcmp)(const void *, const *)为由用户提供的比较函数。
=================================
首先,给出一个简单的比较函数

 

 
  
  1.  
  2.     if(*a<*b) 
  3.  
  4.         return -1; 
  5.  
  6.     else if(*a>*b) 
  7.  
  8.             return 1; 
  9.  
  10.             else 
  11.  
  12.                 return 0; 
  13.  

然后在main函数中我们只需要将各种参数按照顺序填进函数中调用就可以了。
像这样……


 
  
  1. int search[10]={1,3,6,7,10,11,13,19,28,56}   
  2. int a=13,*p,i; 
  3.  p=(int *)bsearch(&a, search,10, sizeof(int),CMP); 

其他的东西就不写了,全写出来就没意思了
最后给出二分查找的介绍:

二分法搜索又叫做折半搜索或折半查找。它是一种经典的顺序文件查找算法,要求查找表按关键字有序排列(从小到大或从大到小, bsearch 函数要求从小到大排列)。其查找思想是:逐渐缩小查找范围,直至得到查找结果。查找过程为(以从小到大的序列为例):将要查找的元素的关键字 k 与当前当前查找范围内位于居中的那个元素的关键字进行比较,若匹配,则查找成功,返回该元素的指针即可;否则,若查找元素的关键字 k 小于当前查找范围内位于居中的那个元素的关键字,则到当前查找范围的前半部分重复上述查找过程,若查找元素的关键字 k 大于当前查找范围内位于居中的那个元素的关键字,则到当前查找范围的后半部分重复上述查找过程。
最后,函数原型中提到的那个用户提供的比较函数可以稍微关注下,
看到这个函数的时候 我想到了好像以前在js里面也遇到过要用户自己提供比较函数的情况,参考这篇文章: http://hanbin.blog.51cto.com/1518861/879872