JavaScript折半查找(二分查找)算法原理与实现方法示例


Posted in Javascript onAugust 06, 2018

本文实例讲述了JavaScript折半查找(二分查找)算法原理与实现方法。分享给大家供大家参考,具体如下:

一、问题描述:

在一个升序数组中,使用折半查找得到要查询的值的索引位置。如:

var a=[1,2,3,4,5,6,7,8,9];
search(a,3);//返回2
search(a,1);//左边界,返回0
search(a,9);//右边界,返回8
search(a,0);//比最小的值还小,返回"您查找的数值不存在"
search(a,10);//比最大的值还大,返回"您查找的数值不存在"

注:折半查找必须在有序数组中才有效,无序的数组不能实现查找功能。比如:在[10,5,6,7,8,9,20]中查找10,中间索引位置的值为7,比较得出7比10小,因而应该在右子数组中查找,实际上不可能找到10;

二、我的实现

function search(arr,num) {
  var l=arr.length;
  var left=0;
  var right=l-1;
  var center=Math.floor((left+right)/2);
  while(left<=l-1&&right>=0){
    if (arr[center]==num) return center;
    if (left==right) return "您查找的数不存在";
    if (arr[center]>num) {
      right=center-1;
      center=Math.floor((left+right)/2);
    }else if (arr[center]<num) {
      left=center+1;
      center=Math.floor((left+right)/2);
    }
  }
}
var a=[1,2,3,4,5,6,7,8,9];
console.log(search(a,-2));

说明:

1、基本思路:

每次比较,如果数组中间索引位置的值比要查找的值大,就转而在数组中间位置之前的子数组中查找;相反,如果数组中间索引位置的值比要查找的值大,就转而在数组中间位置之后的子数组中查找;如果数组中间索引位置的值恰好等于要查找的值,就返回该索引位置。

2、left定义查找范围的起始位置,right定义查找范围的结束位置,center定义查找范围的中间位置。

3、while中的逻辑说明:

(1)由于不知道具体查找查找多少次,while是比较好的选择;

(2)循环结束条件:

a、一旦当right小于0时,就不再查找,再纠缠也不会有结果。例如:在a=[1,2,3,4,5,6,7,8,9]中查找0,当查找范围变为left=0,right=0,center=0时,进入while语句,由于arr[center]>0,故执行

right=center-1;
center=Math.floor((left+right)/2);

得到right=-1此时应不再进入循环;

b、一旦当left>l-1时,就不再查找,同样再纠缠也不会有结果。例如:在a=[1,2,3,4,5,6,7,8,9]中查找10,当查找范围变为left=8,right=8,center=8时,进入while语句,由于arr[center]<10,故执行

left=center;
center=Math.floor((left+right)/2);

得到left=9,此时应不再进入循环;

4、始终是通过center匹配到要查找的值;

5、Math.floor处理了查找范围长度为偶数的情况;

6、当left==right了,而arr[center]==num却没执行,可以得出结论查找不到的;

7、当arr[center]==num时,整个函数都结束了,后面语句是不会执行的。

上述代码使用在线HTML/CSS/JavaScript代码运行工具http://tools.3water.com/code/HtmlJsRun测试运行结果如下:

JavaScript折半查找(二分查找)算法原理与实现方法示例

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
权威JavaScript 中的内存泄露模式
Aug 13 Javascript
javascript instanceof 与typeof使用说明
Jan 11 Javascript
Jquery下判断Id是否存在的代码
Jan 06 Javascript
jQuery之网页换肤实现代码
Apr 30 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
Feb 12 Javascript
Javascript与jQuery方法的隐藏与显示
Jan 19 Javascript
你不知道的 javascript【推荐】
Jan 08 Javascript
jQuery Form表单取值的方法
Jan 11 Javascript
JavaScript全屏和退出全屏事件总结(附代码)
Aug 17 Javascript
微信小程序中吸底按钮适配iPhone X方案
Nov 29 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
Apr 04 Javascript
深入浅析React中diff算法
May 19 Javascript
JavaScript插入排序算法原理与实现方法示例
Aug 06 #Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
Aug 06 #Javascript
ES6 系列之 WeakMap的使用示例
Aug 06 #Javascript
JavaScript选择排序算法原理与实现方法示例
Aug 06 #Javascript
ES6 中可以提升幸福度的小功能
Aug 06 #Javascript
原生JS实现的轮播图功能详解
Aug 06 #Javascript
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
Aug 06 #Javascript
You might like
phpMyAdmin链接MySql错误 个人解决方案
2009/12/28 PHP
并发下常见的加锁及锁的PHP具体实现代码
2010/10/12 PHP
解析php如何将日志写进syslog
2013/06/28 PHP
PhpStorm+xdebug+postman调试技巧分享
2020/09/15 PHP
jQuery 打造动态下滑菜单实现说明
2010/04/15 Javascript
js操作iframe兼容各种主流浏览器示例代码
2013/07/22 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
2013/12/04 Javascript
jQuery实现拖拽效果插件的方法
2015/03/23 Javascript
理解 JavaScript Scoping &amp; Hoisting(二)
2015/11/18 Javascript
限制只能输入数字的实现代码
2016/05/16 Javascript
js剪切板应用clipboardData实例解析
2016/05/29 Javascript
jQuery 遍历map()方法详解
2016/11/04 Javascript
jQuery简易时光轴实现方法示例
2017/03/13 Javascript
vue.js使用v-model指令实现的数据双向绑定功能示例
2018/05/22 Javascript
使用iView Upload 组件实现手动上传图片的示例代码
2018/10/01 Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
2018/12/09 Javascript
vue项目前端错误收集之sentry教程详解
2019/05/27 Javascript
详解解决小程序中webview页面多层history返回问题
2019/08/20 Javascript
Vue中多元素过渡特效的解决方案
2020/02/05 Javascript
python使用xauth方式登录饭否网然后发消息
2014/04/11 Python
matplotlib savefig 保存图片大小的实例
2018/05/24 Python
用于业余项目的8个优秀Python库
2018/09/21 Python
python读出当前时间精度到秒的代码
2019/07/05 Python
Python3实现汉语转换为汉语拼音
2019/07/08 Python
python+selenium 点击单选框-radio的实现方法
2019/09/03 Python
pytorch 实现模型不同层设置不同的学习率方式
2020/01/06 Python
Python接口自动化测试框架运行原理及流程
2020/11/30 Python
python中delattr删除对象方法的代码分析
2020/12/15 Python
New Balance德国官方网站:购买鞋子和服装
2019/08/31 全球购物
给物业的表扬信
2014/01/21 职场文书
企业法人授权委托书范本
2014/09/23 职场文书
企业党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
承诺书的内容有哪些,怎么写?
2019/06/21 职场文书
redis配置文件中常用配置详解
2021/04/14 Redis
SQL注入篇学习之盲注/宽字节注入
2022/03/03 MySQL
10大幻兽系恶魔果实 蝙蝠果实上榜,第一自愈能力强
2022/03/18 日漫