qsort&&bsearch
来源:互联网 发布:unix socket编程 编辑:程序博客网 时间:2024/04/30 09:13
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 );
}
可以大致比较两个函数的类似和差别。
#i nclude <string.h>
#i nclude <stdlib.h>
struct dict
{
char english[11];
char foreign[11];
}a[100001];
{
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中成员
- qsort&&bsearch
- bsearch和qsort
- qsort 与bsearch
- qsort和bsearch
- bsearch and qsort
- qsort 与 bsearch
- qsort与bsearch
- poj 2503 qsort+bsearch
- qsort()与bsearch()
- qsort bsearch 函数用法
- qsort与bsearch
- 成绩排序 qsort&&bsearch
- qsort与bsearch学习
- qsort bsearch的应用
- qsort与bsearch
- qsort和bsearch的使用
- qsort 与 bsearch 的魔力
- qsort和bsearch的运用
- Oracle中的CHAR,NCHAR,VARCHAR,VARCHAR2,NVARCHAR2
- DroidDraw
- 11111
- linux ls 命令 最常用的选项
- 数据加密
- qsort&&bsearch
- powerbuilder 读取excel报表中的隐藏列
- Linux 的多线程编程的高效开发经验
- 客户端如何实现对MFC ActiveX的Event 的调用介绍
- 指针常量
- Delphi 2007安装问题
- Ajax里的onreadystatechange的作用是什么
- Lucene为数据库建立索引
- WITH AS的用法