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 checkbox 全选/反选及批量删除
Apr 28 Javascript
require.js深入了解 require.js特性介绍
Sep 04 Javascript
使用AngularJS创建自定义的过滤器的方法
Jun 18 Javascript
jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
Aug 25 Javascript
javascript构造函数以及原型对象的理解
Jan 13 Javascript
JS实现浏览器打印、打印预览示例
Feb 28 Javascript
JavaScript下拉菜单功能实例代码
Mar 01 Javascript
JavaScript结合HTML DOM实现联动菜单
Apr 05 Javascript
微信小程序 swiper组件构建轮播图的实例
Sep 20 Javascript
浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
Feb 21 Javascript
Vue.js获取手机系统型号、版本、浏览器类型的示例代码
May 10 Javascript
简单了解vue 插值表达式Mustache
Jul 22 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
ThinkPHP防止重复提交表单的方法实例分析
2018/05/10 PHP
权威JavaScript 中的内存泄露模式
2007/08/13 Javascript
js 强制弹出窗口代码研究-又一款代码
2010/03/20 Javascript
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
2011/03/25 Javascript
jquery插件制作 自增长输入框实现代码
2012/08/17 jQuery
window.opener用法和用途实例介绍
2013/08/19 Javascript
3种js实现string的substring方法
2015/11/09 Javascript
jQuery实现输入框邮箱内容自动补全与上下翻动显示效果【附demo源码下载】
2016/09/20 Javascript
详解angular中通过$location获取路径(参数)的写法
2017/03/21 Javascript
详解vue-resource promise兼容性问题
2017/06/20 Javascript
Angular2使用vscode断点调试ts文件的方法
2017/12/13 Javascript
微信小程序实时聊天WebSocket
2018/07/05 Javascript
解决vue路由后界面没有变化,但是链接有的问题
2018/09/01 Javascript
JS如何获取地址栏的参数实例讲解
2018/10/06 Javascript
vue中多路由表头吸顶实现的几种布局方式
2019/04/12 Javascript
使用webpack编译es6代码的方法步骤
2019/04/28 Javascript
JS 自执行函数原理及用法
2019/08/05 Javascript
python dict.get()和dict['key']的区别详解
2016/06/30 Python
Python简单操作sqlite3的方法示例
2017/03/22 Python
动态规划之矩阵连乘问题Python实现方法
2017/11/27 Python
Python简单计算数组元素平均值的方法示例
2017/12/26 Python
python 读取DICOM头文件的实例
2018/05/07 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
2019/06/18 Python
将数据集制作成VOC数据集格式的实例
2020/02/17 Python
Python爬虫实现vip电影下载的示例代码
2020/04/20 Python
Django中ORM的基本使用教程
2020/12/22 Python
Python3+Appium安装及Appium模拟微信登录方法详解
2021/02/16 Python
使用html5 canvas 画时钟代码实例分享
2015/11/11 HTML / CSS
村捐赠仪式答谢词
2014/01/21 职场文书
求职信内容一般写什么?
2015/03/20 职场文书
2015年计划生育责任书
2015/05/08 职场文书
写好Python代码的几条重要技巧
2021/05/21 Python
详解使用 CSS prefers-* 规范提升网站的可访问性与健壮性
2021/05/25 HTML / CSS
nginx配置虚拟主机的详细步骤
2021/07/21 Servers
从结婚开始的恋爱故事。小说《我的美好婚事》TV动画化决定
2022/04/07 日漫
解决Mysql中的innoDB幻读问题
2022/04/29 MySQL