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 相关文章推荐
js加解密 脚本解密
Feb 22 Javascript
css值转换成数值请抛弃parseInt
Oct 24 Javascript
SinaEditor使用方法详解
Dec 28 Javascript
jquery.Ajax()方法调用Asp.Net后台的方法解析
Feb 13 Javascript
Jquery倒计时源码分享
May 16 Javascript
javascript模拟post提交隐藏地址栏的参数
Sep 03 Javascript
javascript实现全局匹配并替换的方法
Apr 27 Javascript
angularJS深拷贝详解
Mar 23 Javascript
详解vue服务端渲染(SSR)初探
Jun 19 Javascript
Bootstrap弹出框(Popover)被挤压的问题小结
Jul 11 Javascript
VueJs组件prop验证简单介绍
Sep 12 Javascript
jQuery 获取除某指定对象外的其他对象 ( :not() 与.not())
Oct 10 jQuery
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
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
2018/05/11 PHP
jQuery对表单的操作代码集合
2011/04/06 Javascript
三种方式获取XMLHttpRequest对象
2014/04/21 Javascript
JQuery中Text方法用法实例分析
2015/05/18 Javascript
原生js实现图片轮播特效
2015/12/18 Javascript
不得不分享的JavaScript常用方法函数集(下)
2015/12/25 Javascript
D3.js实现饼状图的方法详解
2016/09/21 Javascript
怎样判断jQuery当前元素是隐藏还是显示
2016/11/23 Javascript
bootstrap中的 form表单属性role=&quot;form&quot;的作用详解
2017/01/20 Javascript
vue实现nav导航栏的方法
2017/12/13 Javascript
vue中el-upload上传图片到七牛的示例代码
2018/10/19 Javascript
js中数组常用方法总结(推荐)
2019/04/09 Javascript
vue实现信息管理系统
2020/05/30 Javascript
vue-cli打包后本地运行dist文件中的index.html操作
2020/08/12 Javascript
Python 用户登录验证的小例子
2013/03/06 Python
python使用fileinput模块实现逐行读取文件的方法
2015/04/29 Python
使用Python生成url短链接的方法
2015/05/04 Python
Python实现股市信息下载的方法
2015/06/15 Python
python版飞机大战代码分享
2018/11/20 Python
自定义django admin model表单提交的例子
2019/08/23 Python
python中p-value的实现方式
2019/12/16 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
2020/10/15 Python
python 制作磁力搜索工具
2021/03/04 Python
CSS3媒体查询(Media Queries)介绍
2013/09/12 HTML / CSS
Infababy英国:婴儿推车、Travel System婴儿车和婴儿汽车座椅销售
2018/05/23 全球购物
澳大利亚鞋仓库:Shoe Warehouse
2019/07/25 全球购物
澳大利亚在线奢侈品时尚零售平台:Azura Runway
2021/01/13 全球购物
总裁秘书岗位职责
2013/12/04 职场文书
应聘面试自我评价
2014/01/24 职场文书
2014年廉洁自律承诺书
2014/05/26 职场文书
安全标语口号
2014/06/09 职场文书
2014年幼师工作总结
2014/11/22 职场文书
医院员工辞职信范文
2015/05/12 职场文书
论文评审意见
2015/06/05 职场文书
小学安全教育主题班会
2015/08/12 职场文书
如何起草一份正确的合伙创业协议书?
2019/07/04 职场文书