C++ 中库函数bsearch的简单研究(含示例)
/**//*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
详解
文章作者: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的简单研究(含示例)的更多相关文章
- SQLSERVER中的LOB页面简单研究
		
SQLSERVER中的LOB页面简单研究 这篇文章和我另一篇文章是相辅相成的,在看<SQLSERVER2012 列存储索引的简单研究和测试>这篇文章之前希望大家先看一下这篇文章o(∩_∩) ...
 - Nginx中location模块的详细配置(含示例)
		
题记 此前在配置Nginx location模块的时候玩出了一些bug,折腾了一段时间.后来网上也查阅了相关的资料,看着也比较混乱.周末有空想着好好整理一下location模块的配置,结合自己的亲手实 ...
 - SQLSERVER2012 列存储索引的简单研究和测试
		
SQLSERVER2012 列存储索引的简单研究和测试 SQLSERVER2012 列存储索引的简单研究和测试 看这篇文章之前可以先看一下下面这两篇文章: 列存储索引 http://www.cnblo ...
 - 简单研究Loader笔记
		
2015-11-11 18:25:34 1. Loader是什么? /** * Static library support version of the framework's {@link and ...
 - JScript中的prototype(原型)属性研究
		
今天看到同事使用js中的Prototype,感觉很是新鲜.由此想深入学习一下prototype(英['prəʊtətaɪp] 美['protə'taɪp]n. 原型:标准,模范),在学习prototy ...
 - 前后端分离Web项目中,RBAC实现的研究
		
在前后端分离Web项目中,RBAC实现的研究 最近手头公司的网站项目终于渐渐走出混沌,走上正轨,任务也轻松了一些,终于有时间整理和总结一下之前做的东西. 以往的项目一般使用模板引擎(如ejs)渲染 ...
 - Flume1.9.0的安装、部署、简单应用(含分布式、与Hadoop3.1.2、Hbase1.4.9的案例)
		
目录 目录 前言 什么是Flume? Flume的特点 Flume的可靠性 Flume的可恢复性 Flume的一些核心概念 Flume的官方网站在哪里? Flume在哪里下载以及如何安装? 设置环境变 ...
 - Deferred在jQuery和Angular中的使用与简单实现
		
Deferred在jQuery和Angular中的使用与简单实现 Deferred是在jQuery1.5版本中加入的,并且jQuery使用它完全重写了AJax,以前也只是偶尔使用.但是上次在使用Ang ...
 - java中Color类的简单总结
		
java中Color类的简单总结 1.颜色的常识 任何颜色都是由三原色组成(RGB),JAVA中支持224为彩色,即红绿蓝分量取值 介于0-255之间(8位表示) 2.Color类中的常量 publi ...
 
随机推荐
- VisitorPattern(访问者模式)-----Java/.Net
			
在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法.通过这种方式,元素的执行算法可以随着访问者改变而改变.这种类型的设计模式属于行为型模式.根据模式,元 ...
 - 《带你装B,带你飞》pytest成神之路2- 执行用例规则和pycharm运行的三种姿态
			
1. 简介 今天北京下的雪好大好美啊!!!哎呀,忘记拍照片了,自己想象一下吧.言归真传,今天还是开始pytest的学习和修炼,上一篇写完后群里反响各式各样的,几家欢乐几家愁,有的高兴说自己刚好要用到了 ...
 - Ural1057. Amount of Degrees  题解 数位DP
			
题目链接: (请自行百度进Ural然后查看题号为1057的那道题目囧~) 题目大意: Create a code to determine the amount of integers, lying ...
 - RabbitMQ安装(Windows)
			
一.下载安装 由于RabbitMQ是用Erlang语言编写的,因此需要先安装Erlang. 通过http://www.erlang.org/downloads获取对应安装文件进行安装 增加环境变量ER ...
 - Python 线性回归(Linear Regression) 基本理解
			
背景 学习 Linear Regression in Python – Real Python,对线性回归理论上的理解做个回顾,文章是前天读完,今天凭着记忆和理解写一遍,再回温更正. 线性回归(Lin ...
 - 微信公众号 唤醒手机导航APP  一看就懂 复制即用
			
公司自研发框架,基本上没啥看不懂的 基本都是直接复制用就好了!希望能帮助到需要的朋友! 新建俩个同级文件用来保存 jsapi_ticket 和 access_token的文件 命名:jsapi_tic ...
 - python之字符串的简单应用
			
1.实现5+7加法运算 value = input(">>>") v1, v2 = value.split('+') c1 = int(v1) c2 = int( ...
 - vue传值(父子传值,非父子传值)
			
vue组件传值,分为父子传值和非父子传值,父子传值又分为父传子和子传父. 组件之间的传值,实现了数据的联动,是从操作Dom到操作数据一个跳转性的突破,在学习vue双向绑定原理之后, 这种观念就应该继续 ...
 - CVE-2019-0708远程桌面服务远程执行代码漏洞exp利用过程
			
CVE-2019-0708远程桌面服务远程执行代码漏洞 上边这洞是啥我就不多说了,描述类的自行百度. 受影响系统版本范围: Windows Server 2008 R2 Windows Server ...
 - Webpack实战(六):如何优雅地运用样式CSS预处理
			
上一篇文章中,我主要分享了<Webpack如何分离样式文件>CSS 预处理器是一个能让你通过预处理器自己独有的语法来生成CSS的程序,css预处理指的是在开发中我们经常会使用一些样式预编译 ...