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 相关文章推荐
showModelessDialog()使用详解
Sep 21 Javascript
JS实现QQ图片一闪一闪的效果小例子
Jul 31 Javascript
JavaScript在网页中画圆的函数arc使用方法
Nov 13 Javascript
DeviceOne 让你一见钟情的App快速开发平台
Feb 17 Javascript
JS中改变this指向的方法(call和apply、bind)
Mar 26 Javascript
js完整倒计时代码分享
Sep 18 Javascript
Vuejs入门教程之Vue生命周期,数据,手动挂载,指令,过滤器
Apr 19 Javascript
利用node.js本地搭建HTTP服务器
Apr 19 Javascript
jquery动态赋值id与动态取id方法示例
Aug 21 jQuery
详解VueRouter进阶之导航钩子和路由元信息
Sep 13 Javascript
Rollup处理并打包JS文件项目实例代码
May 31 Javascript
深入理解Angularjs 脏值检测
Oct 12 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
thinkphp5.1框架容器与依赖注入实例分析
2019/07/23 PHP
PHP创建XML的方法示例【基于DOMDocument类及SimpleXMLElement类】
2019/09/10 PHP
Input 特殊事件onpopertychange和oninput
2009/06/17 Javascript
JQuery 1.4 中的Ajax问题
2010/01/23 Javascript
深入理解JQuery keyUp和keyDown的区别
2013/12/12 Javascript
js简单的表格添加行和删除行操作示例
2014/03/31 Javascript
Javascript中对象继承的实现小例
2014/05/12 Javascript
通过$(this)使用jQuery包装后的方法或属性
2014/05/18 Javascript
Javascript中arguments对象详解
2014/10/22 Javascript
Extjs 点击复选框在表格中增加相关信息行
2016/07/12 Javascript
javascript之IE版本检测超简单方法
2016/08/20 Javascript
jquery实现文本框的禁用和启用
2016/12/07 Javascript
angular十大常见问题
2017/03/07 Javascript
用node和express连接mysql实现登录注册的实现代码
2017/07/05 Javascript
element ui table(表格)实现点击一行展开功能
2018/12/04 Javascript
如何封装了一个vue移动端下拉加载下一页数据的组件
2019/01/06 Javascript
Vue动态组件和异步组件原理详解
2019/05/06 Javascript
Vue中使用wangeditor富文本编辑的问题
2021/02/07 Vue.js
python实现感知器
2017/12/19 Python
Python3.6安装及引入Requests库的实现方法
2018/01/24 Python
python实现单向链表详解
2018/02/08 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
2018/04/30 Python
python检索特定内容的文本文件实例
2018/06/05 Python
在IPython中进行Python程序执行时间的测量方法
2018/11/01 Python
ubuntu 16.04下python版本切换的方法
2019/06/14 Python
python调用其他文件函数或类的示例
2019/07/16 Python
tensorflow2.0的函数签名与图结构(推荐)
2020/04/28 Python
CSS超出文本指定宽度用省略号代替和文本不换行
2016/05/05 HTML / CSS
HTML5 canvas实现移动端上传头像拖拽裁剪效果
2016/03/14 HTML / CSS
建筑系毕业生自我鉴定
2014/01/24 职场文书
创业计划书模版
2014/02/05 职场文书
奶茶店创业计划书
2014/08/14 职场文书
解除聘用合同证明书范本
2014/09/11 职场文书
基督教追悼会答谢词
2015/09/29 职场文书
导游词之黄果树瀑布
2019/09/20 职场文书
MySQL批量更新不同表中的数据
2022/05/11 MySQL