qsort与bsearch的cmp(转)

http://www.cppblog.com/prayer/archive/2010/09/07/126093.html


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中成员
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值