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 相关文章推荐
[原创]用javascript实现检测指定目录是否存在的方法
Jan 12 Javascript
Jquery 扩展方法
May 06 Javascript
js实现运动logo图片效果及运动元素对象sportBox使用方法
Dec 25 Javascript
Egret引擎开发指南之创建项目
Sep 03 Javascript
JS跨域解决方案之使用CORS实现跨域
Apr 14 Javascript
jQuery实现为LI列表前3行设置样式的方法【2种方法】
Sep 04 Javascript
js中的eval()函数把含有转义字符的字符串转换成Object对象的方法
Dec 02 Javascript
js禁止Backspace键使浏览器后退的实现方法
Sep 01 Javascript
详解在React里使用&quot;Vuex&quot;
Apr 02 Javascript
vue.js实现会动的简历(包含底部导航功能,编辑功能)
Apr 08 Javascript
vue操作动画的记录animate.css实例代码
Apr 26 Javascript
javascript设计模式 ? 职责链模式原理与用法实例分析
Apr 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
php中实现获取随机数组列表的自定义函数
2015/04/02 PHP
php获取网页上所有链接的方法
2015/04/03 PHP
Yii2汉字转拼音类的实例代码
2017/04/18 PHP
php给数组赋值的实例方法
2019/09/26 PHP
幻宇的层模拟窗口效果-提供演示和下载
2007/01/20 Javascript
js parseInt(&quot;08&quot;)未指定进位制问题
2010/06/19 Javascript
javascript截取字符串(通过substring实现并支持中英文混合)
2013/06/24 Javascript
JS实现仿百度输入框自动匹配功能的示例代码
2014/02/19 Javascript
js图片延迟技术一般的思路与示例
2014/03/20 Javascript
js实现表单检测及表单提示的方法
2015/08/14 Javascript
Angularjs使用ng-repeat中$even和$odd属性的注意事项
2016/12/31 Javascript
iview给radio按钮组件加点击事件的实例
2017/09/30 Javascript
VueJs 搭建Axios接口请求工具
2017/11/20 Javascript
微信小程序倒计时功能实例代码
2018/07/17 Javascript
微信小程序sessionid不一致问题解决
2019/08/30 Javascript
python实现问号表达式(?)的方法
2013/11/27 Python
Python正则获取、过滤或者替换HTML标签的方法
2016/01/28 Python
浅析python3中的os.path.dirname(__file__)的使用
2018/08/30 Python
10个Python小技巧你值得拥有
2018/09/29 Python
详解如何在cmd命令窗口中搭建简单的python开发环境
2019/08/29 Python
Python必须了解的35个关键词
2020/07/16 Python
python基本算法之实现归并排序(Merge sort)
2020/09/01 Python
css3 box-sizing属性使用参考指南
2013/01/08 HTML / CSS
HTML5中的Web Notification桌面通知功能的实现方法
2019/07/29 HTML / CSS
50岁生日感言
2014/01/23 职场文书
物流业务员岗位职责
2014/02/08 职场文书
农村结婚典礼司仪主持词
2014/03/14 职场文书
考察现实表现材料
2014/05/19 职场文书
社区志愿者活动方案
2014/08/18 职场文书
暑假安全教育广播稿
2014/09/10 职场文书
2014国庆节演讲稿:祖国在我心中(400字)
2014/09/25 职场文书
党的群众路线教育实践活动查摆剖析材料
2014/10/10 职场文书
破坏寝室公物检讨书
2014/11/17 职场文书
2014年体育教学工作总结
2014/12/09 职场文书
同乡会致辞
2015/07/30 职场文书
浅谈MySQL 亿级数据分页的优化
2021/06/15 MySQL