JS数组搜索之折半搜索实现方法分析


Posted in Javascript onMarch 27, 2017

本文实例讲述了JS数组搜索之折半搜索实现方法。分享给大家供大家参考,具体如下:

一. 方法原理:

当从一个给定的序列数组arr中, 查找某个特定值value时, 折半搜索法是这样做的:

1. 确定搜索范围的起始点: 起点startIndex = 0, 终点endIndex = arr.length - 1;

2. 根据起始点来确定一个中间点middle = Math.floor((终点 - 起点) / 2);

3. 在startIndex < endIndex的前提下, 比较arr[middle]与value的大小:

(1) arr[middle] < value

调整搜索范围为数组的后半部分, 即startIndex = middle + 1, endIndex = arr.length -1;

(2) arr[middle] > value

调整搜索范围为数组的前半部分, 即startIndex = 0, endIndex = middle - 1;

接着, 重新计算middle, 再比较arr[middle]与value, 直到两者相等或者startIndex >= endIndex.

二. 代码:

// 该例的写法适用于序列为由小到大的数组
function binarySearch(arr, value) {
  var startIndex = 0,
  endIndex = arr.length - 1;
  middle = Math.floor((endIndex - startIndex) / 2);
  while (arr[middle] !== value && startIndex < endIndex) {
    if (arr[middle] > value) {
      endIndex = middle - 1;
    } else if (arr[middle] < value) {
      startIndex = middle + 1;
    }
    middle = Math.floor((endIndex - startIndex) / 2);
  }
  return (arr[middle] !== value) ? -1 : middle;
}

三. 优缺点:

(1) 优点:

每查找一次, 被查找的数组项数量会减少一半, 因此其在性能上要优于线性搜索法(在数组项较多时, 尤其明显);

(2) 缺点:

只适用于序列数组, 在对普通数组使用该方法之前, 需要对数组进行排序

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

Javascript 相关文章推荐
JQuery 无废话系列教程(二) jquery实战篇上
Jun 23 Javascript
两个多选select(multiple左右)添加、删除选项和取值实例
May 12 Javascript
javascript 中that的含义示例介绍
May 14 Javascript
js图片跟随鼠标移动代码
Nov 26 Javascript
JS文件上传神器bootstrap fileinput详解
Jan 28 Javascript
JavaScript函数参数的传递方式详解
Mar 06 Javascript
nuxt.js中间件实现拦截权限判断的方法
Nov 21 Javascript
vue中使用vue-cli接入融云实现即时通信
Apr 19 Javascript
vue+eslint+vscode配置教程
Aug 09 Javascript
vue动态绘制四分之三圆环图效果
Sep 03 Javascript
详解vue-router 动态路由下子页面多页共活的解决方案
Dec 22 Javascript
Vue指令实现OutClick的示例
Nov 16 Javascript
javascript实现下雨效果
Mar 27 #Javascript
HTML的select控件美化
Mar 27 #Javascript
JS实现的点击表头排序功能示例
Mar 27 #Javascript
深入理解AngularJS中的ng-bind-html指令
Mar 27 #Javascript
vue2.0实战之基础入门(1)
Mar 27 #Javascript
jQuery中的deferred使用方法
Mar 27 #jQuery
Angular2利用组件与指令实现图片轮播组件
Mar 27 #Javascript
You might like
从零开始的异世界生活:第二季延期后,B站上架了第二部剧场版
2020/05/06 日漫
消息持续发送的完整例子
2006/10/09 PHP
php empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
PHP之将POST数据转化为字符串的实现代码
2016/11/03 PHP
PHP curl 或 file_get_contents 获取需要授权页面的方法
2017/05/05 PHP
JavaScript 函数式编程的原理
2009/10/16 Javascript
jquery学习笔记二 实现可编辑的表格
2010/04/09 Javascript
jQuery之排序组件的深入解析
2013/06/19 Javascript
常见表单重复提交问题整理及解决方法
2013/11/13 Javascript
jsMind通过鼠标拖拽的方式调整节点位置
2015/04/13 Javascript
轻松学习jQuery插件EasyUI EasyUI实现树形网络基本操作(2)
2015/11/30 Javascript
JS组件系列之Bootstrap table表格组件神器【终结篇】
2016/05/10 Javascript
React实现点击删除列表中对应项
2017/01/10 Javascript
javascript 中设置window.location.href跳转无效问题解决办法
2017/02/09 Javascript
Three.js入门之hello world以及如何绘制线
2017/09/25 Javascript
仿淘宝JSsearch搜索下拉深度用法
2018/01/15 Javascript
JS实现访问DOM对象指定节点的方法示例
2018/04/04 Javascript
JavaScript中的&quot;=、==、===&quot;区别讲解
2019/01/22 Javascript
jquery实现动态创建form并提交的方法示例
2019/05/27 jQuery
mac PyCharm添加Python解释器及添加package路径的方法
2018/10/29 Python
Django管理员账号和密码忘记的完美解决方法
2018/12/06 Python
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
pyinstaller打包单个exe后无法执行错误的解决方法
2019/06/21 Python
50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
2019/11/20 Python
CSS3——齿轮转动关键代码
2013/05/02 HTML / CSS
世界最大域名注册商:GoDaddy
2016/07/24 全球购物
牧马人澳大利亚官网:Wrangler澳大利亚
2019/10/08 全球购物
世界上最大的艺术社区:SAA
2020/12/30 全球购物
《故乡》教学反思
2014/04/10 职场文书
关于读书的活动方案
2014/08/14 职场文书
纪律教育学习心得体会
2014/09/02 职场文书
呼啸山庄读书笔记
2015/06/29 职场文书
2015年女工委工作总结
2015/07/27 职场文书
《酸的和甜的》教学反思
2016/02/18 职场文书
nginx 多个location转发任意请求或访问静态资源文件的实现
2021/03/31 Servers
Python进程池与进程锁之语法学习
2022/04/11 Python