bsearch函數二分法

在初學寫程序時,特別是剛開始接觸數據結構時,基本都是在查找;

各種排序,其實都是在爲查找做準備。

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

今天我們來看看關於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 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章