/**//*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
详解

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

}

C++ 中库函数bsearch的简单研究(含示例)的更多相关文章

  1. SQLSERVER中的LOB页面简单研究

    SQLSERVER中的LOB页面简单研究 这篇文章和我另一篇文章是相辅相成的,在看<SQLSERVER2012 列存储索引的简单研究和测试>这篇文章之前希望大家先看一下这篇文章o(∩_∩) ...

  2. Nginx中location模块的详细配置(含示例)

    题记 此前在配置Nginx location模块的时候玩出了一些bug,折腾了一段时间.后来网上也查阅了相关的资料,看着也比较混乱.周末有空想着好好整理一下location模块的配置,结合自己的亲手实 ...

  3. SQLSERVER2012 列存储索引的简单研究和测试

    SQLSERVER2012 列存储索引的简单研究和测试 SQLSERVER2012 列存储索引的简单研究和测试 看这篇文章之前可以先看一下下面这两篇文章: 列存储索引 http://www.cnblo ...

  4. 简单研究Loader笔记

    2015-11-11 18:25:34 1. Loader是什么? /** * Static library support version of the framework's {@link and ...

  5. JScript中的prototype(原型)属性研究

    今天看到同事使用js中的Prototype,感觉很是新鲜.由此想深入学习一下prototype(英['prəʊtətaɪp] 美['protə'taɪp]n. 原型:标准,模范),在学习prototy ...

  6. 前后端分离Web项目中,RBAC实现的研究

    在前后端分离Web项目中,RBAC实现的研究   最近手头公司的网站项目终于渐渐走出混沌,走上正轨,任务也轻松了一些,终于有时间整理和总结一下之前做的东西. 以往的项目一般使用模板引擎(如ejs)渲染 ...

  7. Flume1.9.0的安装、部署、简单应用(含分布式、与Hadoop3.1.2、Hbase1.4.9的案例)

    目录 目录 前言 什么是Flume? Flume的特点 Flume的可靠性 Flume的可恢复性 Flume的一些核心概念 Flume的官方网站在哪里? Flume在哪里下载以及如何安装? 设置环境变 ...

  8. Deferred在jQuery和Angular中的使用与简单实现

    Deferred在jQuery和Angular中的使用与简单实现 Deferred是在jQuery1.5版本中加入的,并且jQuery使用它完全重写了AJax,以前也只是偶尔使用.但是上次在使用Ang ...

  9. java中Color类的简单总结

    java中Color类的简单总结 1.颜色的常识 任何颜色都是由三原色组成(RGB),JAVA中支持224为彩色,即红绿蓝分量取值 介于0-255之间(8位表示) 2.Color类中的常量 publi ...

随机推荐

  1. 07Shell数组

    Shell 数组变量 普通数组:只能使用整数作为数组索引 关联数组:可以使用字符串作为数组索引 普通数组 定义数组 方法1: 一次赋一个值 数组名[索引]=变量值 示例 # array1[0]=pea ...

  2. Intellij IDEA2019.1.3破解

    下载 JetbrainsCrack.jar(链接:https://pan.baidu.com/s/1Dkw1PruzBlEMjcYszNlSZA 提取码:2bf7),放到bin目录下(其实位置可以随便 ...

  3. Oracle表空间概述及其基本管理

    最近在工作中遇到有同事对Oracle表空间的理解有问题,所以写了这篇文章.我会从概念,管理及特别需要关注的点等几个维度对表空间进行一些介绍.本文以介绍表空间为主,涉及到的其他概念不展开描述.有问题的地 ...

  4. eclipse中使用postgreSQL报错( Cannot load JDBC driver class )

    需求: 使用Maven插件调用PostgreSQL数据库 环境: eclipse_4.5.0+JDK_1.7+Tomcat_7.0+Maven+postgresql-9.1-901.jdbc4.jar ...

  5. 【转】基于ArcGIS for javascript api 轨迹回放

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  6. POJ Muddy Fields 泥泞的牧场 二分图

    Muddy Fields Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13235   Accepted: 4879 汪星人 ...

  7. HTML中使用Vue+Dhtmlxgantt制作任务进度图

    HTML中使用Vue+Dhtmlxgantt制作任务进度图 Dhtmlxgantt官网: https://dhtmlx.com/docs/products/dhtmlxGantt/ 参考文章 甘特图配 ...

  8. css选择器用法,使用css定位元素,css和xpath元素定位的区别

    css定位元素 1.什么是css? CSS(Cascading Style Sheets)层叠样式表,是一种语言,用来描述html或者xml的显示样式.在css语言中有css选择器,在selenium ...

  9. dotnet restore 初次运行 这个 指令 会安装 特别多的 4.0.0 或者 4.1 的 rc2-24027的 东东 这些东西。

  10. 半夜了我来发张图 睡觉 ControllerDescriptor 与 ActionDescriptor 之间 的 关系