qsort函數聲明如下:
void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *));
參數說明如下: base: 要排序的數組 nmemb: 數組中的元素數目 size: 每個數組元素占用內存空間,可使用sizeof獲得 compar: 比較兩個數組元素的比較函數。本比較函數的第一個參數值小于、等于、大于第二參數值時,本比較函數的返回值應分別小于、等于、大于零。
也就說你要實現一個這樣的函數: int cmp(const void *a, const void *b) 如果a > b,返回>0 如果a == b, 返回0 如果a < b,返回<0 這里的a和b的關系僅僅是邏輯上的,并不是值比較,所以排序的可以不僅僅是數字,還可以是字符。
|
bsearch函數聲明如下:
void *bsearch(const void *key, const void *base, size_t *nelem,
size_t width, int(*fcmp)(const void *, const *));
參數的意思和qsort的差不多,區別在于:
1. qsort用來排序,bsearch用二分法來查找元素
2. bsearch中的base必須是升序排列的數組!!!
3. 如果數組里有重復的答案,則bsearch會返回其中一個的地址 (具體返回哪一個不確定)
4. bsearch有五個自變量,第一個是要找的東西,剩下的跟qsort一模一樣
5. bsearch如果沒找到所求則回傳NULL ,否則回傳該元素被找到的地址(void *)
c函數qsort()和bsearch()的用法
使用qsort()排序 并 用 bsearch()搜索是一個比較常用的組合,使用方便快捷。
qsort 的函數原型是void __cdecl qsort ( void *base, size_t num, size_t width, int (__cdecl *comp)(const void *, const void* ) )
其中base是排序的一個集合數組,num是這個數組元素的個數,width是一個元素的大小,comp是一個比較函數。
比如:對一個長為1000的數組進行排序時,int a[1000]; 那么base應為a,num應為 1000,width應為 sizeof(int),comp函數隨自己的命名。
qsort(a,1000,sizeof(int ),comp);
其中comp函數應寫為:
int comp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
而關于bsearch() ,他和qsort的用法基本一樣,只是他的返回值是一個指向找到的單位元素的一個指針,另外他多了一個參數,是一個指向查找元素的一個指針。
比如:從上面例子中的結構體數組中查找一個字符串:
str *locate;
char buffer[30]="abc";
locate=(str*)bsearch(buffer,strin,total,sizeof(str),com);
int com(const void *a,const void *b)
{
return strcmp( (char*)a, ((str*)b)->str2 );
}
注意這里cmp與qsotr的有所不同。
qsort 和bsearch的cmp函數不同的
qsort 比較的時dict 數組的兩個成員
bsearch比較的時key 和dict中成員