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 相关文章推荐
Save a File Using a File Save Dialog Box
Jun 18 Javascript
什么是json和jsonp,jQuery json实例详详细说明
Dec 11 Javascript
Jquery UI震动效果实现原理及步骤
Feb 04 Javascript
使用Grunt.js管理你项目的应用说明
Apr 24 Javascript
form表单只提交数据而不进行页面跳转的解决方案
Sep 18 Javascript
jQuery中的val()示例应用
Feb 26 Javascript
浅谈javascript中的call、apply、bind
Mar 06 Javascript
微信公众号 摇一摇周边功能开发
Dec 08 Javascript
Vue实现双向绑定的方法
Dec 22 Javascript
JS跨域请求外部服务器的资源
Feb 06 Javascript
Bootstrap Table中的多选框删除功能
Jul 15 Javascript
小程序click-scroll组件设计
Jun 18 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
Windows PHP5和Apache的安装与配置
2009/06/08 PHP
Smarty局部缓存的几种方法简介
2014/06/17 PHP
PHP中的output_buffering详细介绍
2014/09/27 PHP
PHP+Ajax实现无刷新分页实例详解(附demo源码下载)
2016/04/07 PHP
PHP编程求最大公约数与最小公倍数的方法示例
2017/05/29 PHP
Yii 2.0自带的验证码使用经验分享
2017/06/19 PHP
JScript中使用ADODB.Stream判断文件编码的代码
2008/06/09 Javascript
基于jquery的合并table相同单元格的插件(精简版)
2011/04/05 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
2013/11/28 Javascript
JavaScript中的异常捕捉介绍
2014/12/31 Javascript
浅谈JS原型对象和原型链
2016/03/02 Javascript
通过原生JS实现为元素添加事件的方法
2016/11/23 Javascript
微信小程序页面传值实例分析
2017/04/19 Javascript
vue实现移动端图片裁剪上传功能
2020/08/18 Javascript
vue2.0使用swiper组件实现轮播效果
2017/11/27 Javascript
微信小程序地图导航功能实现完整源代码附效果图(推荐)
2019/04/28 Javascript
vue3.0中的双向数据绑定方法及优缺点
2019/08/01 Javascript
vue监听用户输入和点击功能
2019/09/27 Javascript
three.js 制作动态二维码的示例代码
2020/07/31 Javascript
[15:23]教你分分钟做大人:虚空假面
2014/10/30 DOTA
Python应用03 使用PyQT制作视频播放器实例
2016/12/07 Python
Python 中 Virtualenv 和 pip 的简单用法详解
2017/08/18 Python
Python3 伪装浏览器的方法示例
2017/11/23 Python
Python语言进阶知识点总结
2019/05/28 Python
python 实现多线程下载m3u8格式视频并使用fmmpeg合并
2019/11/15 Python
Python二元算术运算常用方法解析
2020/09/15 Python
XML文档面试题
2015/08/05 面试题
公司综合部的成员自我评价分享
2013/11/05 职场文书
高级方案规划工程师岗位职责
2013/11/29 职场文书
职工趣味运动会方案
2014/02/10 职场文书
2014年学雷锋活动总结
2014/06/26 职场文书
小学领导班子对照材料
2014/08/23 职场文书
2014年大学班级工作总结
2014/11/14 职场文书
毕业证明模板
2015/06/19 职场文书
2019年“红色之旅”心得体会1000字(3篇)
2019/09/27 职场文书
Vue中使用import进行路由懒加载的原理分析
2022/04/01 Vue.js