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 相关文章推荐
IE下js调试工具Companion.JS
Oct 15 Javascript
script的async属性以非阻塞的模式加载脚本
Jan 15 Javascript
jquery上传插件fineuploader上传文件使用方法(jquery图片上传插件)
Dec 05 Javascript
JS数组的遍历方式for循环与for...in
Jul 31 Javascript
jQuery中focus事件用法实例
Dec 26 Javascript
JQuery EasyUI学习教程之datagrid 添加、修改、删除操作
Jul 09 Javascript
JavaScript模块化之使用requireJS按需加载
Apr 12 Javascript
Spring shiro + bootstrap + jquery.validate 实现登录、注册功能
Jun 02 jQuery
详解VueJS 数据驱动和依赖追踪分析
Jul 26 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
Dec 03 Javascript
Vue 刷新当前路由的实现代码
Sep 26 Javascript
基于vue实现微博三方登录流程解析
Nov 04 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
PHP中strlen()和mb_strlen()的区别浅析
2014/06/19 PHP
ThinkPHP中自定义错误页面和提示页面实例
2014/11/22 PHP
php实现过滤字符串中的中文和数字实例
2015/07/29 PHP
php str_getcsv把字符串解析为数组的实现方法
2017/04/05 PHP
PHP设计模式之注册树模式分析
2018/01/26 PHP
用javascript获得地址栏参数的两种方法
2006/11/08 Javascript
原生js实现给指定元素的后面追加内容
2013/04/10 Javascript
使用JavaScript 实现对象 匀速/变速运动的方法
2013/05/08 Javascript
每天一篇javascript学习小结(Array数组)
2015/11/11 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
2017/03/24 jQuery
Windows下Node.js安装及环境配置方法
2017/09/18 Javascript
Angularjs添加排序查询功能的实例代码
2017/10/24 Javascript
javascript如何使用函数random来实现课堂随机点名方法详解
2020/07/28 Javascript
简介Python的collections模块中defaultdict类型的用法
2016/07/07 Python
python僵尸进程产生的原因
2017/07/21 Python
python实现屏保计时器的示例代码
2018/08/08 Python
Python WEB应用部署的实现方法
2019/01/02 Python
在PyCharm导航区中打开多个Project的关闭方法
2019/01/17 Python
python 自定义装饰器实例详解
2019/07/20 Python
django搭建项目配置环境和创建表过程详解
2019/07/22 Python
Python3实现发送邮件和发送短信验证码功能
2020/01/07 Python
西班牙香水和化妆品网上商店:Douglas
2017/10/29 全球购物
UGG澳洲官网:UGG Australia
2018/04/26 全球购物
SIXPAD智能健身仪英国官网:革命性的训练装备品牌
2018/09/27 全球购物
酒店人事专员岗位职责
2013/12/19 职场文书
2014年商场国庆节活动策划方案
2014/09/16 职场文书
自主招生自荐信格式
2015/03/04 职场文书
2015年公务员个人工作总结
2015/04/24 职场文书
教学副校长工作总结
2015/08/13 职场文书
心得体会格式及范文
2016/01/25 职场文书
区域销售大会开幕词
2016/03/04 职场文书
NodeJs内存占用过高的排查实战记录
2021/05/10 NodeJs
《战锤40K:暗潮》跳票至9月 公布新宣传片
2022/04/03 其他游戏
CSS中float高度塌陷问题的四种解决方案
2022/04/18 HTML / CSS
Spring中bean集合注入的方法详解
2022/07/07 Java/Android
python playwright之元素定位示例详解
2022/07/23 Python