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 相关文章推荐
使用户点击后退按钮使效三行代码
Jul 07 Javascript
JavaScript入门之基本函数详解
Oct 21 Javascript
jQuery标签编辑插件Tagit使用指南
Apr 21 Javascript
javascript实现实时输出当前的时间
Apr 27 Javascript
JavaScript对表格或元素按文本,数字或日期排序的方法
May 26 Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
Jul 28 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
Nov 25 Javascript
解决bootstrap导航栏navbar在IE8上存在缺陷的方法
Jul 01 Javascript
Node.js实现文件上传的示例
Jun 28 Javascript
bootstrap下拉分页样式 带跳转页码
Dec 29 Javascript
前端js中的事件循环eventloop机制详解
May 15 Javascript
Vue防止白屏添加首屏动画的实例
Oct 31 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异步调用socket实现代码
2012/01/12 PHP
php实现的农历算法实例
2015/08/11 PHP
PHP如何通过带尾指针的链表实现'队列'
2020/10/22 PHP
浏览器图片选择预览、旋转、批量上传的JS代码实现
2013/12/04 Javascript
node.js中的console.info方法使用说明
2014/12/09 Javascript
jQuery图片特效插件Revealing实现拉伸放大
2015/04/22 Javascript
简单总结JavaScript中的String字符串类型
2016/05/26 Javascript
利用Angular+Angular-Ui实现分页(代码加简单)
2017/03/10 Javascript
js 获取今天以及过去日期
2017/04/11 Javascript
Vue中使用vux的配置详解
2017/05/05 Javascript
手写Node静态资源服务器的实现方法
2018/03/20 Javascript
JavaScript中join()、splice()、slice()和split()函数用法示例
2018/08/24 Javascript
Vue Prop属性功能与用法实例详解
2019/02/23 Javascript
Vue.js递归组件实现组织架构树和选人功能案例分析
2019/07/03 Javascript
Vue开发环境中修改端口号的实现方法
2019/08/15 Javascript
微信小程序8种数据通信的方式小结
2020/02/03 Javascript
ES6中new Function()语法及应用实例分析
2020/02/19 Javascript
Javascript实现html转pdf高清版(提高分辨率)
2020/02/19 Javascript
js实现限定区域范围拖拉拽效果
2020/11/20 Javascript
Python实现的批量下载RFC文档
2015/03/10 Python
Saltstack快速入门简单汇总
2016/03/01 Python
浅析Python中return和finally共同挖的坑
2017/08/18 Python
JSONLINT:python的json数据验证库实例解析
2017/11/28 Python
python使用docx模块读写docx文件的方法与docx模块常用方法详解
2020/02/17 Python
selenium学习教程之定位以及切换frame(iframe)
2021/01/04 Python
python 获取计算机的网卡信息
2021/02/18 Python
HTML5的新特性(1)
2016/03/03 HTML / CSS
HTML5页面中尝试调起APP功能
2017/09/12 HTML / CSS
从当地商店送来的杂货:Instacart
2018/08/19 全球购物
优秀求职信范文分享
2013/12/19 职场文书
支行行长竞聘演讲稿
2014/05/15 职场文书
信用社主任竞聘演讲稿
2014/05/23 职场文书
离婚起诉书范本
2015/05/18 职场文书
2015年全民创业工作总结
2015/07/23 职场文书
Java基础之详解HashSet的使用方法
2021/06/30 Java/Android
Nginx设置HTTPS的方法步骤 443证书配置方法
2022/03/21 Servers