bsearch函数二分法

在初学写程序时,特别是刚开始接触数据结构时,基本都是在查找;

各种排序,其实都是在为查找做准备。

=============================

今天我们来看看关于c语言中自带的一个二分法搜索函数bsearch

通过这个函数可以简单的认识到二分法搜索的一些内在的原理,以及发散一点其他搜索方法的东西。

=============================

首先,介绍这个函数

函数原型:

void *bsearch(const void *key, const void *base, size_t *nelem,
size_t width, int(*fcmp)(const void *, const *)) 

头文件:#include<stdlib.h>
参数介绍:
参数key指向要查找的关键字的指针;
base指向从小到大的次序存放元素的查找表;
nelem指定查找表元素的个数;
width指定查找表中每个元素的字节数;
int(*fcmp)(const void *, const *)为由用户提供的比较函数。
=================================
首先,给出一个简单的比较函数

{ 

    if(*a<*b) 

        return -1; 

    else if(*a>*b) 

            return 1; 

            else 

                return 0; 

} 

然后在main函数中我们只需要将各种参数按照顺序填进函数中调用就可以了。
像这样……

int search[10]={1,3,6,7,10,11,13,19,28,56}
int a=13,*p,i;
 p=(int *)bsearch(&a, search,10, sizeof(int),CMP); 

其他的东西就不写了,全写出来就没意思了最后给出二分查找的介绍:

二分法搜索又叫做折半搜索或折半查找。它是一种经典的顺序文件查找算法,要求查找表按关键字有序排列(从小到大或从大到小,bsearch函数要求从小到大排列)。其查找思想是:逐渐缩小查找范围,直至得到查找结果。查找过程为(以从小到大的序列为例):将要查找的元素的关键字k与当前当前查找范围内位于居中的那个元素的关键字进行比较,若匹配,则查找成功,返回该元素的指针即可;否则,若查找元素的关键字k小于当前查找范围内位于居中的那个元素的关键字,则到当前查找范围的前半部分重复上述查找过程,若查找元素的关键字k大于当前查找范围内位于居中的那个元素的关键字,则到当前查找范围的后半部分重复上述查找过程。
最后,函数原型中提到的那个用户提供的比较函数可以稍微关注下,
看到这个函数的时候 我想到了好像以前在js里面也遇到过要用户自己提供比较函数的情况,

参考这篇文章:http://www.cnblogs.com/hanbin/archive/2011/05/25/2056155.html

时间: 2024-11-16 21:33:45

bsearch函数二分法的相关文章

bsearch

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

Python函数部分

Python函数的初识 Python函数的进阶 Python中的闭包与迭代器 Python生成器/推导式/生成器表达式 Python内置函数二 (递归函数,匿名函数,二分法) 原文地址:https://www.cnblogs.com/heshun/p/10090644.html

stdlib

system(pause): int cmp(const void *a ,const void *b) { return *(int *)a - *(int *)b ;          //从小到大排序,把a,b位置反过来就是从大到小 } qsort:void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));base:数组   nelem查找长度 一般是数组长度  width每个元素所占

C/C++中的排序和查找

以下内容来自<C/C++程序设计实用案例教程> 1.排序 1.1使用qsort函数 C/C++库函数提供了快速排序函数qsort(q时quick的简写),需要引入头文件<stdlib.h>(注:C++中尽量使用<cstdlib>) C/C++中库函数qsort函数声明如下: void qsort(void* base, size_t num, size_t size, int(*compar)(const void*, const void*)); 第一个参数base:

ListSet_对半搜索的递归算法

对半搜索是一种二分搜索, 将表划分为长度几乎相等的两个子表. 共有函数Search()调用私有函数BSearch(). 而后递归调用BSearch()函数实现对有序表的对半搜索. mid, left, right均为元素下标, 如果当前表不为空, 则令x与l[mid]比较. 若两者相等, 则搜索成功. 若前者小于后者, 则继续查找左半部分, 否 则查找右半部分. 下标范围分别为[left, mid - 1], [mid + 1, right]. 如果当前搜索表为空表, 搜索失败返回NotPres

《泛型编程与stl》笔记

以下是STL六大组件(componments): adapters  配接器 用来修饰其他组件.包括iterator adapters.function adapters.container adapters三大类. allocators 配置器 用来分配空间.空间可来自于内存或磁盘--取决于配置器如何 实现.主要用来服务容器. algorithms 算法 如sort,bineary search,permutation.... containers 容器 就是数据结构,用来存放元素.如vect

day05匿名函数,内置函数,二分法,递归,模块

yield作为表达式来使用的方式 #grep -rl 'python /root """ 查找root下文件中含有python的文件 """ import os def init(func): def wrapper(*args,**kwargs): g=func(*args,**kwargs) next(g) return g return wrapper @init def search(target): while True: search

函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数

函数嵌套名称空间与作用域闭包函数装饰器迭代器生成器三元表达式,列表解析,生成器表达式递归与二分法内置函数--------------------------------------------函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数def max(x,y): if x>y: return x else: return ydef max1(a,b,c,d): res=max(a,b) res2=max(res,c) res3=ma

携程函数、递归、二分法、import、from。。。import

携程函数 与yield类似 yield: 1:把函数的执行结果封装好__iter__和__next__,即得到一个迭代器 2:与return功能类似,都可以返回值,但不同的是,return只能 返回一次值,而yield可以返回多次值 3:函数暂停与再继续运行的状态是有yield保存 def func(count): print('start') while True: yield count count+=1 g=func(10) print(g) print(next(g)) print(ne