在初學寫程序時,特別是剛開始接觸數據結構時,基本都是在查找;
各種排序,其實都是在爲查找做準備。
=============================
今天我們來看看關於c語言中自帶的一個二分法搜索函數bsearch
通過這個函數可以簡單的認識到二分法搜索的一些內在的原理,以及發散一點其他搜索方法的東西。
=============================
首先,介紹這個函數
函數原型:
- void *bsearch(const void *key, const void *base, size_t *nelem,
- size_t width, int(*fcmp)(const void *, const *))
頭文件:#include<stdlib.h>
參數介紹:
參數key指向要查找的關鍵字的指針;
base指向從小到大的次序存放元素的查找表;
nelem指定查找表元素的個數;
width指定查找表中每個元素的字節數;
int(*fcmp)(const void *, const *)爲由用戶提供的比較函數。
=================================
首先,給出一個簡單的比較函數
- {
- if(*a<*b)
- return -1;
- else if(*a>*b)
- return 1;
- else
- return 0;
- }
然後在main函數中我們只需要將各種參數按照順序填進函數中調用就可以了。
像這樣……
- int search[10]={1,3,6,7,10,11,13,19,28,56}
- int a=13,*p,i;
- p=(int *)bsearch(&a, search,10, sizeof(int),CMP);
其他的東西就不寫了,全寫出來就沒意思了
最後給出二分查找的介紹:二分法搜索又叫做折半搜索或折半查找。它是一種經典的順序文件查找算法,要求查找表按關鍵字有序排列(從小到大或從大到小,bsearch函數要求從小到大排列)。其查找思想是:逐漸縮小查找範圍,直至得到查找結果。查找過程爲(以從小到大的序列爲例):將要查找的元素的關鍵字k與當前當前查找範圍內位於居中的那個元素的關鍵字進行比較,若匹配,則查找成功,返回該元素的指針即可;否則,若查找元素的關鍵字k小於當前查找範圍內位於居中的那個元素的關鍵字,則到當前查找範圍的前半部分重複上述查找過程,若查找元素的關鍵字k大於當前查找範圍內位於居中的那個元素的關鍵字,則到當前查找範圍的後半部分重複上述查找過程。
最後,函數原型中提到的那個用戶提供的比較函數可以稍微關注下,
看到這個函數的時候 我想到了好像以前在js裏面也遇到過要用戶自己提供比較函數的情況,參考這篇文章:http://hanbin.blog.51cto.com/1518861/879872