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 相关文章推荐
jQuery.get、jQuery.getJSON、jQuery.post无法返回JSON问题的解决方法
Jul 28 Javascript
jQuery动态地获取系统时间实现代码
May 24 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
Apr 25 Javascript
了不起的node.js读书笔记之node.js中的特性
Dec 22 Javascript
Jquery api 速查表分享
Jan 12 Javascript
jQuery mobile转换url地址及获取url中目录部分的方法
Dec 04 Javascript
HTML5 JS压缩图片并获取图片BASE64编码上传
Nov 16 Javascript
js图片轮播手动切换特效
Jan 12 Javascript
简单实现bootstrap选项卡效果
Feb 08 Javascript
node.JS的crypto加密模块使用方法详解(MD5,AES,Hmac,Diffie-Hellman加密)
Feb 06 Javascript
Vue组件化开发之通用型弹出框的实现
Feb 28 Javascript
2020淘宝618理想生活列车自动领喵币js脚本的代码
Jun 02 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
一个简单的域名注册情况查询程序
2006/10/09 PHP
解析如何屏蔽php中的phpinfo()函数
2013/06/06 PHP
php中base_convert()进制数字转换函数实例
2014/11/20 PHP
CodeIgniter框架基本增删改查操作示例
2017/03/23 PHP
php二维数组按某个键值排序的实例讲解
2019/02/15 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
2019/09/04 PHP
js对象之JS入门之Array对象操作小结
2011/01/09 Javascript
编写针对IE的JS代码两种编写方法
2013/01/30 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
2014/04/25 Javascript
javascript常用代码段搜集
2014/12/04 Javascript
jQuery中unwrap()方法用法实例
2015/01/16 Javascript
JS实现带有抽屉效果的产品类网站多级导航菜单代码
2015/09/15 Javascript
微信小程序 教程之事件
2016/10/18 Javascript
小程序getLocation需要在app.json中声明permission字段
2019/04/04 Javascript
nodejs中实现用户注册路由功能
2019/05/20 NodeJs
nodejs实现获取本地文件夹下图片信息功能示例
2019/06/22 NodeJs
js实现简易点击切换显示或隐藏
2020/11/29 Javascript
Django实现组合搜索的方法示例
2018/01/23 Python
python微信跳一跳系列之棋子定位像素遍历
2018/02/26 Python
Centos7 Python3下安装scrapy的详细步骤
2018/03/15 Python
python调用Matplotlib绘制分布点并且添加标签
2018/05/31 Python
Python爬虫的两套解析方法和四种爬虫实现过程
2018/07/20 Python
PyQt5 QListWidget选择多项并返回的实例
2019/06/17 Python
python获取磁盘号下盘符步骤详解
2019/06/19 Python
详解PyTorch中Tensor的高阶操作
2019/08/18 Python
HTML里显示pdf、word、xls、ppt的方法示例
2020/04/14 HTML / CSS
Artist Guitars新西兰:乐器在线商店
2017/09/17 全球购物
如何启动时不需输入用户名与密码
2014/05/09 面试题
校优秀毕业生主要事迹
2014/05/26 职场文书
数学教育专业求职信
2014/07/22 职场文书
加强作风建设演讲稿
2014/10/24 职场文书
2014年社区妇联工作总结
2014/12/02 职场文书
2015年初中教务处工作总结
2015/07/21 职场文书
会议室使用管理制度
2015/08/06 职场文书
Python requests库参数提交的注意事项总结
2021/03/29 Python
MySQL定时备份数据库(全库备份)的实现
2021/09/25 MySQL