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 相关文章推荐
js CSS操作方法集合
Oct 31 Javascript
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
Jun 08 Javascript
jquery Tab效果和动态加载的简单实例
Dec 11 Javascript
javascript中interval与setTimeOut的区别示例介绍
Mar 14 Javascript
javaScript使用EL表达式的几种方式
May 27 Javascript
JS实现的数组全排列输出算法
Mar 19 Javascript
跟我学习javascript的函数和函数表达式
Nov 16 Javascript
JS获取input file绝对路径的方法(推荐)
Aug 02 Javascript
AngularJS实现的2048小游戏功能【附源码下载】
Jan 03 Javascript
antd Upload 文件上传的示例代码
Dec 14 Javascript
layui的面包屑或者表单不显示的解决方法
Sep 05 Javascript
JS+CSS实现3D切割轮播图
Mar 21 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
php adodb连接带密码access数据库实例,测试成功
2008/05/14 PHP
MySQL时间字段究竟使用INT还是DateTime的说明
2012/02/27 PHP
php获取随机数组列表的方法
2014/11/13 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
thinkPHP框架乐观锁和悲观锁实例分析
2019/10/30 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
ext实现完整的登录代码
2008/08/08 Javascript
JavaScript截取字符串的Slice、Substring、Substr函数详解和比较
2014/03/20 Javascript
JavaScript中使用document.write向页面输出内容实例
2014/10/16 Javascript
JavaScript插件化开发教程 (一)
2015/01/27 Javascript
JavaScript中的return语句简单介绍
2015/12/07 Javascript
js格式化输入框内金额、银行卡号
2016/02/01 Javascript
jQuery通过写入cookie实现更换网页背景的方法
2016/04/15 Javascript
最简单的tab切换实例代码
2016/05/13 Javascript
微信公众号开发 实现点击返回按钮就返回到聊天界面
2016/12/15 Javascript
jQuery中用on绑定事件时需注意的事项
2017/03/19 Javascript
Angular2入门--架构总览
2017/03/29 Javascript
JavaScrpt的面向对象全面解析
2017/05/09 Javascript
浅谈angular2路由预加载策略
2017/10/04 Javascript
vue实现微信分享朋友圈,发送朋友的示例讲解
2018/02/10 Javascript
JQuery实现ajax请求的示例和注意事项
2018/12/10 jQuery
jquery获取file表单选择文件的路径、名字、大小、类型
2019/01/18 jQuery
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
2019/05/08 Javascript
vue router总结 $router和$route及router与 router与route区别
2019/07/05 Javascript
JS+html5实现异步上传图片显示上传文件进度条功能示例
2019/11/09 Javascript
[03:09]显微镜下的DOTA2第一期——带你走进华丽的DOTA2世界
2014/06/20 DOTA
python生成器generator用法实例分析
2015/06/04 Python
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
SQL面试题
2013/12/09 面试题
学期自我评价
2014/01/27 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
2014年环境卫生工作总结
2014/11/24 职场文书
2015年党建工作总结
2015/03/30 职场文书
2015年乡镇发展党员工作总结
2015/03/31 职场文书
postman中form-data、x-www-form-urlencoded、raw、binary的区别介绍
2022/01/18 HTML / CSS
vue @ ~ 相对路径 路径别名设置方式
2022/06/05 Vue.js