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的关系仅仅是逻辑上的,并不是值比较,所以排序的可以不仅仅是数字,还可以是字符。

注意:这个函数只能将base中的元素升序排列(太让我失望了)!!!

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;
}

是对一个二维数组的进行排序:

int a[1000][2]; 其中按照a[i][0]的大小进行一个整体的排序,其中a[i][1]必须和a[i][0]一起移动交换。

qsort(a,1000,sizeof(int)*2,comp);

int comp(const void *a,const void *b)
{
return ((int *)a)[0]-((int *)b)[0];
}

对字符串进行一个排序:

char a[1000][20];

qsort(a,1000,sizeof(char)*20,comp);

int comp(const void *a,const void *b
{
return strcmp((char *)a,(char *)b);
}

对一个结构体进行排序:

typedef struct str
{
char str1[11];
char str2[11];
}str,*stri;
str strin[100001]={0};

int compare(const void *a,const void *b)
{
return strcmp( ((str*)a)->str2 , ((str*)b)->str2 );
}

qsort(strin,total,sizeof(str),compare);

而关于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 );
}

可以大致比较两个函数的类似和差别。

例程: POJ 2503 Babelfish
#i nclude <stdio.h>
#i nclude <string.h>
#i nclude <stdlib.h>
struct dict
{
char english[11];
char foreign[11];
}a[100001];
int mycmp(const void * aa, const void * b)
{
return strcmp(((dict*)aa)->foreign, ((dict*)b)->foreign);
}
int cmp(const void* aa, const void* b)
{
return strcmp((char*) aa, ((dict*)b)->foreign);
}
int main()
{
char line[30], query[11];
int i=0,j,k;
while(gets(line))
{
if(!strcmp(line,"")) break;
k = strlen(line);
for(j=0; j<k; j++)
if(line[j]==' ')
{
line[j]='';
break;
}
strcpy(a[++i].english, line);
strcpy(a[i].foreign, line+j+1);
}
qsort(a+1, i, sizeof(dict), mycmp); while(scanf("%s", query)!=EOF)
{
dict* f = (dict *) bsearch(query,a+1, i, sizeof(dict), cmp); if(f)
printf("%s ",f->english);
else
printf("eh ");
}
return 0;
}
注意
qsort 和bsearch的cmp函数不同的
qsort 比较的时dict 数组的两个成员
bsearch比较的时key 和dict中成员

转载于:https://www.cnblogs.com/zen_chou/archive/2009/05/12/1454854.html

【转载】qsort 与 bsearch 的魔力相关推荐

  1. qsort(bsearch,lsearch)—标准库排序,查找

    2019独角兽企业重金招聘Python工程师标准>>> //对字符串排序 #include<iostream> #include<cstdlib> #incl ...

  2. 魔力宝贝 mysql,[转载]教学【如何架设魔力宝贝私人服务器】

    魔力宝贝服务端 setup.cf 解释 #blserv=211.232.109.164 //bl 服务器地址 #blserv=127.0.0.1 //bl 服务器端口 blserv=222.122.3 ...

  3. qsort(快速排序)的用法

    qsort 目录 qsort函数简介 c函数qsort()和bsearch()的用法 举例 c代码 qsort图 编辑本段qsort函数简介 功 能: 使用快速排序例程进行排序 用 法: void q ...

  4. HDoj-2072-字数

    字数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  5. 第8章 Foundation Kit介绍

    本文转载至  http://blog.csdn.net/mouyong/article/details/16947321 Objective-C是一门非常精巧实用的语言,目前我们还没有研究完它提供的全 ...

  6. STL编程:C++的忠告!

    Copy别人的,有少量修改,可以做为一下参考! C++之父Bjarne Stroustrup 写的 The C++ Programming Language (Special Edition) 中各章 ...

  7. C++STL与泛型编程(3)容器之分类与测试

    文章目录 容器的分类 序列式容器(sequence containers)代码示例 辅助函数 array 容器 array容器的测试代码 测试代码中部分函数解析 vector 容器 vector 容器 ...

  8. PAT甲级1012:The Best Rank (25)

    题目 To evaluate the performance of our first year CS majored students, we consider their grades of th ...

  9. 【侯捷】C++STL标准库与泛型编程(第三讲)

    第三讲 算法的形式 C++标准库的算法,是什么东西? 说明: 算法Algorithm 是个 function template,标准库中的算法都长成如下这样: template<typename ...

最新文章

  1. 由粗到精学习LVI-SAM基础:多传感器内外参标定原理
  2. 迷你世界电锯机器人_迷你世界:会旋转的机器人,安装多个火箭炮,全方位轰炸敌人...
  3. iOS开发 Block的用法
  4. vue 组件之间的传值
  5. VTK:Utilities之CommandSubclass
  6. VSS(2005)中如何强行签入文件
  7. 【Linux】一步一步学Linux——nl命令(43)
  8. 弧焊 不同气体对焊缝的影响 100二氧化碳 15%氩气CO2混合
  9. Android SDK中tools详解
  10. 当代研究生应当掌握的并行训练方法(单机多卡)
  11. 自用JavaMail实现
  12. C++ 访问成员 “->“还是“.“
  13. 图:广州南洋理工职业学院管理系“相聚南洋”朗诵(演讲)比赛尘埃落定
  14. 【优化预测】基于matlab差分算法优化ANN预测【含Matlab源码 151期】
  15. Unity2021.2.0版本汉化
  16. CUDA安装成功测试
  17. Windows系统完全卸载删除 Node.js
  18. Word/Excel文档操作API哪家强?一张表带你了解Aspose和Spire系列全功能对比
  19. xlwt对excel表的写入操作
  20. 相似度:医学领域:Exploiting Sentence Embedding for Medical Question Answering

热门文章

  1. centos下打包electron_从零搭建Electron应用 的一系列简单的 Demo
  2. io.jsonwebtoken.SignatureException: JWT signature does not match locally computed signature.
  3. tp5分页不加载搜索参数
  4. linux三并发进程,linux下用进度条显示三个进程的并发
  5. 计算机谱写的古典音乐,2011计算机等级考试:用WPSOffice谱写音乐简谱
  6. php前台提交后台刷新,用js post数据后到后台,处理后如何实现前台页面刷新?...
  7. audio插入背景音乐_网页制作中的html插入背景音乐
  8. python 斐波那契数列 yield_Python中的yield到底是个什么鬼?
  9. python中pd是什么意思_python怎么用pd导入xlsx
  10. excel分类_Excel小技巧61:将输入的数字显示为中文