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 相关文章推荐
最佳JS代码编写的14条技巧
Jan 09 Javascript
JQuery select控件的相关操作实现代码
Sep 14 Javascript
jquery dialog open后,服务器端控件失效的快速解决方法
Dec 19 Javascript
javascript类型转换示例
Apr 29 Javascript
JavaScript中用字面量创建对象介绍
Dec 31 Javascript
不得不分享的JavaScript常用方法函数集(上)
Dec 23 Javascript
node模块机制与异步处理详解
Mar 13 Javascript
Bootstrap CSS布局之表格
Dec 17 Javascript
vue.js父组件使用外部对象的方法示例
Apr 25 Javascript
微信小程序后台解密用户数据实例详解
Jun 28 Javascript
js实现Element中input组件的部分功能并封装成组件(实例代码)
Mar 02 Javascript
Node实现搜索框进行模糊查询
Jun 28 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
《心理测量者3》剧场版动画预告
2020/03/02 日漫
一个很方便的 XML 类!!原创的噢
2006/10/09 PHP
注意:php5.4删除了session_unregister函数
2013/08/05 PHP
PHP定时更新程序设计思路分享
2014/06/10 PHP
laravel 实现根据字段不同值做不同查询
2019/10/23 PHP
采用CSS和JS,刚好我最近有个站点要用到下拉菜单!
2006/06/26 Javascript
XML的代替者----JSON
2007/07/21 Javascript
jquery.validate使用攻略 第三部
2010/07/01 Javascript
javascript权威指南 学习笔记之null和undefined
2011/09/25 Javascript
JavaScript获取多个数组的交集简单实例
2013/11/11 Javascript
js charAt的使用示例
2014/02/18 Javascript
高效Web开发的10个jQuery代码片段
2016/07/22 Javascript
微信小程序实战之顶部导航栏(选项卡)(1)
2020/06/19 Javascript
vue loadmore 组件滑动加载更多源码解析
2017/07/19 Javascript
微信小程序switch开关选择器使用详解
2018/01/31 Javascript
JS实现全屏预览F11功能的示例代码
2018/07/23 Javascript
jQuery选择器之基本过滤选择器用法实例分析
2019/02/19 jQuery
layui use 定义js外部引用函数的方法
2019/09/26 Javascript
[05:05]第三天的dota2
2013/07/29 DOTA
[01:08:32]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第二场 1月18日
2021/03/11 DOTA
pycharm 使用心得(九)解决No Python interpreter selected的问题
2014/06/06 Python
Python中转换角度为弧度的radians()方法
2015/05/18 Python
利用python爬取斗鱼app中照片方法实例
2017/12/03 Python
Python+OpenCV人脸检测原理及示例详解
2020/10/19 Python
python 2.7 检测一个网页是否能正常访问的方法
2018/12/26 Python
softmax及python实现过程解析
2019/09/30 Python
Django单元测试中Fixtures用法详解
2020/02/25 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
2021/03/03 Python
墨西哥巴士车票在线购买:ClickBus
2018/03/27 全球购物
俄罗斯宠物用品网上商店:ZooMag
2019/12/12 全球购物
工程造价自荐信
2013/10/09 职场文书
自荐信的两点禁忌
2013/10/30 职场文书
办公室前台的岗位职责
2013/12/20 职场文书
保安的辞职报告怎么写
2014/01/20 职场文书
总经理助理岗位职责范本
2015/03/31 职场文书
用Python仅20行代码编写一个简单的端口扫描器
2022/04/08 Python