/**//*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. Python第一天哇

    iDLE的清除方法ctrl+: 当然,你首先要把网上百度到那个文件按照步骤加上去啦  我百度的=-=:https://www.cnblogs.com/stuqx/p/7291933.html Pyth ...

  2. 用本地自定义域名访问远程服务器,并支持websocket和cookie

    场景 在公司会有很多测试的机器,或者一些OA服务,Confluence,Jenkins,各种中间件的后台等等,都使用HTTP访问,且由于是内网机器没有域名,输入IP又要输入不同端口,访问起来比较麻烦. ...

  3. 10_时间戳timeStamp 和 时间 time 转换, 根据时间节点倒计时

    1: 时间戳 timeStamp 获取的几种方法及其优劣, 第一种只能精确到秒, 故不推荐使用, 最最常用的也是最官方的是第三种, 通过原型方法进行调用获取精确到毫秒数 : var timestamp ...

  4. MySQL之插入数据(添加数据)-INSERT

    基本语法: INSERT 语句有两种语法形式,分别是 INSERT…VALUES 语句和 INSERT…SET 语句. 1.INSERT...VLAUES语句 INSERT VLAUES的语法格式如下 ...

  5. 物理ceph集群+K8s

    前提条件 在Ceph为k8s创建一个pool ceph osd pool create k8s 128 创建admin用户 ceph auth get-or-create client.admin m ...

  6. 深入理解vue的watch

    深入理解vue的watch vue中的wactch可以监听到data的变化,执行定义的回调,在某些场景是很有用的,本文将深入源码揭开watch额面纱 前言 watch的使用 watch的多种使用方式 ...

  7. 点分治 (等级排) codeforces 321C

    Now Fox Ciel becomes a commander of Tree Land. Tree Land, like its name said, has n cities connected ...

  8. vue学习笔记1:el 与 data

    一.vue介绍 vue是目前三大主流框架之一(React.Angular.Vue) vue特点: 易用 灵活 高效 vue官网:官网链接 二,知识点 vue实例选项: el 注:不能 让el直接管理h ...

  9. Java 中的等待唤醒机制透彻讲解

    线程的状态 首先了解一下什么是线程的状态,线程状态就是当线程被创建(new),并且启动(start)后,它不是一启动就进入了执行状态(run),也不是一直都处于执行状态. 这里说一下Java 的Thr ...

  10. 【5min+】传说中的孪生兄弟? Memory and Span

    系列介绍 [五分钟的dotnet]是一个利用您的碎片化时间来学习和丰富.net知识的博文系列.它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net ...