JavaScript实现二分查找实例代码


Posted in Javascript onFebruary 22, 2017

二分查找的前提为:数组、有序。逻辑为:优先和数组的中间元素比较,如果等于中间元素,则直接返回。如果不等于则取半继续查找。

/**
 * 二分查找,递归实现。
 * @param target
 * @param arr
 * @param start
 * @param end
 * @returns {*}
 */
function binarySearch(target,arr,start,end) {
  var start  = start || 0;
  var end   = end || arr.length-1;
  var mid = parseInt(start+(end-start)/2);
  if(target==arr[mid]){
    return mid;
  }else if(target>arr[mid]){
    return binarySearch(target,arr,mid+1,end);
  }else{
    return binarySearch(target,arr,start,mid-1);
  }
  return -1;
}
/**
 * 有序的二分查找,返回-1或存在的数组下标。不使用递归实现。
 * @param target
 * @param arr
 * @returns {*}
 */
function binarySearch(target,arr) {
  var start  = 0;
  var end   = arr.length-1;
  while (start<=end){
    var mid = parseInt(start+(end-start)/2);
    if(target==arr[mid]){
      return mid;
    }else if(target>arr[mid]){
      start  = mid+1;
    }else{
      end   = mid-1;
    }
  }
  return -1;
}

写完有序,自然而然的想到了无序的情况如何使用二分查找呢?马上想到先使用快排分组,分好组再二分。代码如下:

/**
 * 无序的二分查找。返回true/false
 * @param target
 * @param arr
 * @returns {boolean}
 */
function binarySearch(target,arr) {
  while (arr.length>0){
    //使用快速排序。以mid为中心划分大小,左边小,右边大。
    var left  = [];
    var right  = [];
    //选择第一个元素作为基准元素(基准元素可以为任意一个元素)
    var pivot  = arr[0];
    //由于取了第一个元素,所以从第二个元素开始循环
    for(var i=1;i<arr.length;i++){
      var item = arr[i];
      //大于基准的放右边,小于基准的放左边
      item>pivot ? right.push(item) : left.push(item);
    }
    //得到经过排序的新数组
    if(target==pivot){
      return true;
    }else if(target>pivot){
      arr   = right;
    }else{
      arr   = left;
    }
  }
  return false;
}

写完用快速排序实现的无序二分查找,仔细想了一下该算法的时间复杂度,发现还不如直接一个for循环来得快

以上所述是小编给大家介绍的JavaScript实现二分查找实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JS类定义原型方法的两种实现的区别评论很多
Sep 12 Javascript
jquery设置text的值示例(设置文本框 DIV 表单值)
Jan 06 Javascript
JS网页图片按比例自适应缩放实现方法
Jan 15 Javascript
C++中的string类的用法小结
Aug 07 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
Sep 02 Javascript
jQuery实现页面滚动时智能浮动定位
Jan 08 Javascript
vue日期组件 支持vue1.0和2.0
Jan 09 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
Jan 19 Javascript
jqGrid翻页时数据选中丢失问题的解决办法
Feb 13 Javascript
微信小程序入门之广告条实现方法示例
Dec 05 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
Jul 22 Javascript
js 数据类型判断的方法
Dec 03 Javascript
浅谈jquery拼接字符串效率比较高的方法
Feb 22 #Javascript
微信小程序  TLS 版本必须大于等于1.2问题解决
Feb 22 #Javascript
原生JS实现幻灯片
Feb 22 #Javascript
微信小程序 解析网页内容详解及实例
Feb 22 #Javascript
从零学习node.js之简易的网络爬虫(四)
Feb 22 #Javascript
js中document.referrer实现移动端返回上一页
Feb 22 #Javascript
基于JS实现bookstore静态页面的实例代码
Feb 22 #Javascript
You might like
php 正则匹配函数体
2009/08/25 PHP
php中读写文件与读写数据库的效率比较分享
2013/10/19 PHP
使用PHP生成二维码的两种方法(带logo图像)
2014/03/14 PHP
PHP 面向对象程序设计(oop)学习笔记 (四) - 异常处理类Exception
2014/06/12 PHP
PHP中常见的缓存技术实例分析
2015/09/23 PHP
jquery 笔记 事件
2011/11/02 Javascript
jQuery之选择组件的深入解析
2013/06/19 Javascript
JS控制阿拉伯数字转为中文大写示例代码
2013/09/04 Javascript
在JS中如何调用JSP中的变量
2014/01/22 Javascript
js实现的GridView即表头固定表体有滚动条且可滚动
2014/02/19 Javascript
AspNet中使用JQuery boxy插件的确认框
2015/05/20 Javascript
Vue.js实现一个SPA登录页面的过程【推荐】
2017/04/29 Javascript
详解A标签中href=&quot;&quot;的几种用法
2017/08/20 Javascript
vue实现添加与删除图书功能
2018/10/07 Javascript
如何使用CSS3+JQuery实现悬浮墙式菜单
2019/06/18 jQuery
Python多线程编程(六):可重入锁RLock
2015/04/05 Python
python的else子句使用指南
2016/02/27 Python
深入浅出学习python装饰器
2017/09/29 Python
解决Python的str强转int时遇到的问题
2018/04/09 Python
Python 将Matrix、Dict保存到文件的方法
2018/10/30 Python
解决pandas .to_excel不覆盖已有sheet的问题
2018/12/10 Python
PHP统计代码行数的小代码
2019/09/19 Python
如何使用Python脚本实现文件拷贝
2019/11/20 Python
通过实例解析Python return运行原理
2020/03/04 Python
django xadmin 管理器常用显示设置方式
2020/03/11 Python
python3 sleep 延时秒 毫秒实例
2020/05/04 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
2021/01/08 Python
html5开发三八女王节表白神器
2018/03/07 HTML / CSS
澳大利亚牛仔裤商店:Just Jeans
2016/10/13 全球购物
StubHub西班牙:购买和出售全球活动门票
2017/06/05 全球购物
商场主管竞聘书
2014/03/31 职场文书
中学生期中自我鉴定
2014/04/20 职场文书
班主任自我评价范文
2015/03/11 职场文书
工作失职自我检讨书
2015/05/05 职场文书
检讨书范文大全
2015/05/07 职场文书
Vue Element plus使用方法梳理
2022/12/24 Vue.js