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