适用于各语言的二分查找算法,你get到了嘛?
Hello!大家好,我是努力赚钱买生发水的灰小猿,最近在做开发的时候偶然用到了之前数据结构上的二分查找算法,所以在这里和大家简单的分享一下适用于各种语言的二分查找算法编写。
那么什么叫二分查找算法呢?
二分查找算法定义
所谓二分查找算法,又叫折半查找,一般来说适用于数组元素,具体来说应该是已经按照顺序存储结构排列好的数组元素。它是一种效率较高的查找算法,通过对顺序表进行折半查找,从而获取到元素序列或查找次数的算法。
二分查找算法的过程剖析
我们假设现有的线性表中的元素是按照升序排列的,二分查找算法的思路就是将正在查找的表的中间元素和要查找的元素进行大小比较,若大小相等则输出该元素所在位置或查找次数;
若该中间元素不等于被查找元素时,会将该线性表以中间元素分成前后两部分的线性表,当中间元素小于被查找元素时,重新对后一部分的线性表进行二分查询;
反之,若中间元素大于被查找元素时,对前一部分的线性表进行相同的二分查找,当中间元素等于被查找元素时,查找结束;或直到线性表无法再进行分割时,查找结束,这个时候则说明表中无该元素。
下面是二分查找算法的查找图示:
二分查找算法的时间复杂度
二分查找的基本思想是:设有一个长度为n个元素的升序排列的数组a,分成前后大致相等的两部分,取中间元素a[n/2]与被查找元素(m)做比较,如果m=a[n/2],则找到m,算法中止;
如果m<a[n/2],则只要在数组a的左半部分继续二分查找m,如果m>a[n/2],则在数组a的右半部继续二分查找m.直到m=a[n/2]或数组不可再分割时查找结束。
因此时间复杂度就是while循环的次数,
总共有n个元素,
依次循环下去以后每次查找的元素个数就是:n、n/2、n/4、....n/2^k
若查找个数为n时,也就是第一次查找就找到了元素,则循环次数为1(也就是k=0的时候)所以循环次数为(k+1)
由于n/2^k取整后为(n/2^k)>=1
即令(n/2^k)=1
可得k=log2n,(是以2为底,n的对数)
所以时间复杂度可以表示O(h)=O(log2n)。
二分查找的平均查找长度
设待查找的元素为n,则折半查找的平均查找长度为:
二分查找的普通算法
以下为进行二分查找的函数方法,
传入的参数为升序排列的数组和要查找的元素,若查找到该元素,则返回查找次数,否则返回-1。
int binary_search(int[] a, int value)
{
int low = 0;
int high = a.length - 1;
while (low <= high)
{
int middle = (low + high) / 2;
if (a[middle] == value)
{
return middle;
}
if (value < a[middle])
{
high = middle - 1;
}
else
{
low = middle + 1;
}
}
return -1;
}
二分查找的函数递归算法
传入的参数分别为:递增的数组、要查找的数值、起始查找位置(默认为0)、终止查找位置(默认为数组长度)
int binary_search_ecursion(int a[],int value,int low,int high) {
int middle=0;
if(low<=high)
{
middle = (low+high)/2;
if (a[middle]==value) {
return middle;
}else {
if (a[middle]<value) {
return binary_search_ecursion(a, value, middle+1, high);
}
else {
return binary_search_ecursion(a, value, low, middle-1);
}
}
}
return -1;
}
二分查找的思维方法适用于任何需要进行顺序表查找的语言,并且基本思路都是一样的。上面的二分查找函数是基于C#的,小伙伴们还可以进行延伸。
觉得有用记得点赞关注哟!
- Go语言如何并发超时处理详解
- Go语言中三种不同md5计算方式的性能比较
- Go语言中反射的正确使用
- 从零教你在Linux环境下(ubuntu)如何编译hadoop2.4
- 【Golang语言社区】前端编程-利用CSS3实现雷达扫描效果图特效
- 【Golang语言社区】h5 实现图片拖拽
- go语言结构体定义使用
- Go语言单元测试
- go语言中json转成map结构
- 让你快速认识flume及安装和使用flume1.5传输数据(日志)到hadoop2.2
- 几种服务器端IO模型的简单介绍及实现(上)
- tensorflow版的bvlc模型
- 几种服务器端IO模型的简单介绍及实现(下)
- caffe中关于数据进行预处理的方式
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SpringMVC异常的处理机制
- 刷面试题的正确姿势!Android400道面试题+通关知识宝典助你进大厂,查漏补缺
- 3分钟短文:Laravel路由加模型等于?
- TSF微服务无法查看JVM监控问题
- Mitmproxy 的安装与使用案例
- leetcode之Bigram分词
- TensorFlow2 开发指南 | 01 手写数字识别快速入门
- Spring 数据初始 H2 后进行数据查询提示 Schema not found 错误
- Discourse CentOS 8 全新安装手册
- H2 数据库插入时间的方法
- Spring 配置的 H2 控制台 frameOptions 导致无法访问
- Spring Boot 和 Hibernate 的 H2 数据库配置来进行启动测试
- Java时间处理-LocalDateTime简介
- iOS音视频接入 - TRTC iOS端真机日志导出
- jQuery根据填写的input的数值导出excel表格