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 removeChild 使用注意事项
Apr 11 Javascript
ASP.NET jQuery 实例2 (表单中使用回车在TextBox之间向下移动)
Jan 13 Javascript
修改js Calendar日历控件 兼容IE9/谷歌/火狐
Jan 04 Javascript
js获取下拉列表框中的value和text的值示例代码
Jan 11 Javascript
js中settimeout方法加参数
Feb 28 Javascript
AngularJS内置指令
Feb 04 Javascript
基于javascript实现图片预加载
Jan 05 Javascript
浅谈Angularjs link和compile的使用区别
Oct 21 Javascript
vue-i18n结合Element-ui的配置方法
May 20 Javascript
vue 移动端注入骨架屏的配置方法
Jun 25 Javascript
jquery 键盘事件 keypress() keydown() keyup()用法总结
Oct 23 jQuery
element中el-container容器与div布局区分详解
May 13 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的curl函数的用法总结
2019/02/14 PHP
PHP的imageTtfText()函数深入详解
2021/03/03 PHP
利用JS重写Cognos右键菜单的实现代码
2010/04/11 Javascript
基于jQuery UI CSS Framework开发Widget的经验
2010/08/21 Javascript
jQuery EasyUI API 中文文档 - ComboBox组合框
2011/10/07 Javascript
网页加载时页面显示进度条加载完成之后显示网页内容
2012/12/23 Javascript
简单选项卡 js和jquery制作方法分享
2014/02/26 Javascript
ExtJS4如何自动生成控制grid的列显示、隐藏的checkbox
2014/05/02 Javascript
JavaScript动态创建form表单并提交的实现方法
2015/12/10 Javascript
基于javascript实现图片左右切换效果
2016/01/25 Javascript
JavaScript toUpperCase()方法使用详解
2016/08/26 Javascript
vue2.0父子组件间通信的实现方法
2017/04/19 Javascript
jquery submit()不能提交表单的解决方法
2017/04/24 jQuery
vue2.X组件学习心得(新手必看篇)
2017/07/05 Javascript
js时间戳与日期格式之间相互转换
2017/12/11 Javascript
NW.js 简介与使用方法
2018/02/01 Javascript
vue组件从开发到发布的实现步骤
2018/11/11 Javascript
一个小时快速搭建微信小程序的方法步骤
2019/04/15 Javascript
vue+element 实现商城主题开发的示例代码
2020/03/26 Javascript
[01:01:24]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第三局
2016/02/25 DOTA
python三元运算符实现方法
2013/12/17 Python
python检测某个变量是否有定义的方法
2015/05/20 Python
python通过get,post方式发送http请求和接收http响应的方法
2015/05/26 Python
Python实现将DOC文档转换为PDF的方法
2015/07/25 Python
python读取excel表格生成erlang数据
2017/08/26 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
2019/09/10 Python
python开发入门——列表生成式
2020/09/03 Python
寻找完美的房车租赁:RVShare
2019/02/23 全球购物
新闻编辑自荐信
2013/11/03 职场文书
中学校庆方案
2014/03/17 职场文书
主题教育活动总结
2014/05/05 职场文书
企业员工薪酬方案
2014/06/04 职场文书
2014年预备党员端正入党动机思想汇报
2014/09/13 职场文书
村党支部对照检查材料思想汇报
2014/09/28 职场文书
不同意离婚代理词
2015/05/23 职场文书
golang 接口嵌套实现复用的操作
2021/04/29 Golang