/**//*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 *) */
#include<iostream>
#include<cstdlib>
using namespace std;
int compare(const void*a,const void *b)
{
return *((int*)a)-*((int*)b);
}
int main()
{
int a[100];
int i;
for(i=0;i<100;i++)
a[i]=i+1;
i=50;
int *result;
result=(int*)bsearch((void*)&i,(void*)a,100,sizeof(a[0]),compare);
cout<<i<<' '<<*result<<endl;
system("pause");
return 0;
}
C语言标准库函数 bsearch 详解
C/C++2009-08-1111:52:57阅读247评论0字号:大中小
来源:http://www.slyar.com/blog/stdlib-bsearch.html
C语言中 bsearch 包含在<stdlib.h>头文件中,此函数可以根据你给的条件实现二分查找,如果找到元素则返回指向该元素的指针,否则返回NULL;对于有多个元素匹配成功的情况,bsearch()未定义返回哪一个。使用 bsearch 函数也要自己定义比较子函数。
函数原型
void *bsearch(const void *key, const void *base,size_t num, size_t size, int (*cmp)(const void *, const void *));
解释一下参数
key 指向要查找的元素
base 指向进行查找的数组
num 数组中元素的个数
size 数组中每个元素的大小,一般用sizeof()表示
cmp 比较两个元素的函数,定义比较规则。需要注意的是,查找数组必须是经过预先排序的,而排序的规则要和比较子函数cmp的规则相同。
因为使用bsearch函数要求数组预先排好序,所以该函数通常和快速排序函数(qsort)一起使用,关于qsort函数,详见《C语言标准库函数 qsort 详解》
关于bsearch()的具体应用请见《POJ 2503 Babelfish C语言版》
C语言标准库函数 qsort 详解
2008年12月31日 11:15Slyar发表评论阅读评论
文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。
qsort包含在<stdlib.h>头文件中,此函数根据你给的比较条件进行快速排序,通过指针移动实现排序。排序之后的结果仍然放在原数组中。使用qsort函数必须自己写一个比较函数。
函数原型:
void qsort (void * base, size_t num, size_t size, int ( * comparator ) ( const void *,const void * ) );
用法以及参数说明:
Sorts thenum elements of the array pointed by base, each element size bytes long, usingthe comparator function to determine the order.
The sortingalgorithm used by this function compares pairs of values by calling thespecified comparator function with two pointers to elements of the array.
The functiondoes not return any value, but modifies the content of the array pointed bybase reordering its elements to the newly sorted order.
base Pointer to the first element of the array to be sorted.(数组起始地址)
num Number ofelements in the array pointed by base.(数组元素个数)
size Size inbytes of each element in the array.(每一个元素的大小)
comparatorFunction that compares two elements.(函数指针,指向比较函数)
1、The function must accept two parameters that are pointers toelements, type-casted as void*. These parameters should be cast back to somedata type and be compared.
2、The return value of this function should represent whether elem1is considered less than, equal to, or greater than elem2 by returning,respectively, a negative value, zero or a positive
value.
Return Valuenone (无返回值)
一、对int类型数组排序
int num[100];
int cmp ( constvoid *a , const void *b )
{
return *(int *)a - *(int *)b;
}
qsort(num,100,sizeof(num[0]),cmp);
二、对char类型数组排序(同int类型)
char word[100];
int cmp( constvoid *a , const void *b )
{
return *(char *)a - *(int *)b;
}
qsort(word,100,sizeof(word[0]),cmp);
三、对double类型数组排序
double in[100];
int cmp( constvoid *a , const void *b )
{
return *(double *)a > *(double *)b ? 1 : -1;
}
qsort(in,100,sizeof(in[0]),cmp);
四、对结构体一级排序
struct Sample
{
double data;
int other;
}s[100]
//按照data的值从小到大将结构体排序
int cmp( constvoid *a ,const void *b)
{
return (*(Sample *)a).data > (*(Sample *)b).data ? 1 : -1;
}
qsort(s,100,sizeof(s[0]),cmp);
五、对结构体二级排序
struct Sample
{
int x;
int y;
}s[100];
//按照x从小到大排序,当x相等时按照y从大到小排序
int cmp( constvoid *a , const void *b )
{
struct Sample *c = (Sample *)a;
struct Sample *d = (Sample *)b;
if(c->x != d->x) return c->x - d->x;
else return d->y - c->y;
}
qsort(s,100,sizeof(s[0]),cmp);
六、对字符串进行排序
struct Sample
{
int data;
char str[100];
}s[100];
//按照结构体中字符串str的字典顺序排序
int cmp ( constvoid *a , const void *b )
{
return strcmp( (*(Sample *)a)->str , (*(Sample *)b)->str );
}
qsort(s,100,sizeof(s[0]),cmp);
附加一个完整点的代码,对字符串二维数组排序:
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
chars[2001][1001];
int cmp(constvoid *a, const void *b){
return strcmp((char *)a,(char *)b);
}
int main(){
int i,n;
scanf("%d",&n);
getchar();
for(i=0;i<n;i++) gets(s[i]);
qsort(s,n,1001*sizeof(char),cmp);
for(i=0;i<n;i++) puts(s[i]);
return 0;
}