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 相关文章推荐
jQuery 选择器理解
Mar 16 Javascript
JQuery 操作/获取table具体代码
Jun 13 Javascript
jquery使用each方法遍历json格式数据实例
May 18 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构
Nov 19 Javascript
javaScript中定义类或对象的五种方式总结
Dec 04 Javascript
JS无缝滚动效果实现方法分析
Dec 21 Javascript
简单实现js鼠标跟随效果
Aug 02 Javascript
js判断数组是否包含某个字符串变量的实例
Nov 24 Javascript
angularjs实现的购物金额计算工具示例
May 08 Javascript
Node.js引入UIBootstrap的方法示例
May 11 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
Sep 21 Javascript
深入理解 TypeScript Reflect Metadata
Dec 12 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无限级栏目分类读取的实现代码
2014/02/19 PHP
PHP静态延迟绑定和普通静态效率的对比
2017/10/20 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
2020/02/10 PHP
extjs 初始化checkboxgroup值的代码
2011/09/21 Javascript
关于jQuery的inArray 方法介绍
2011/10/08 Javascript
jQuery使用中可能被XSS攻击的一些危险环节提醒
2016/05/24 Javascript
通过button将form表单的数据提交到action层的实例
2017/09/08 Javascript
BootstrapTable加载按钮功能实例代码详解
2017/09/22 Javascript
详解vue-cli 构建项目 vue-cli请求后台接口 vue-cli使用axios、sass、swiper
2018/05/28 Javascript
async/await优雅的错误处理方法总结
2019/01/30 Javascript
javascript function(函数类型)使用与注意事项小结
2019/06/10 Javascript
JQuery使用属性addClass、removeClass和toggleClass实现增加和删除类操作示例
2019/11/18 jQuery
vue中对象数组去重的实现
2020/02/06 Javascript
python相似模块用例
2016/03/04 Python
Flask框架的学习指南之开发环境搭建
2016/11/20 Python
Python编写一个闹钟功能
2017/07/11 Python
Python爬虫包BeautifulSoup学习实例(五)
2018/06/17 Python
python使用__slots__让你的代码更加节省内存
2018/09/05 Python
Python获取航线信息并且制作成图的讲解
2019/01/03 Python
爬虫代理池Python3WebSpider源代码测试过程解析
2019/12/20 Python
PyCharm中配置PySide2的图文教程
2020/06/18 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
2020/11/26 Python
Flask-SocketIO服务端安装及使用代码示例
2020/11/26 Python
纯CSS3代码实现switch滑动开关按钮效果
2016/08/30 HTML / CSS
关于前端上传文件全面基础扫盲贴(入门)
2019/08/01 HTML / CSS
巧克力领导品牌瑞士莲美国官网:Lindt Chocolate美国
2016/08/25 全球购物
Myprotein蛋白粉美国官网:欧洲畅销运动营养品牌
2016/11/15 全球购物
.NET概念性的面试题
2012/02/29 面试题
证婚人搞笑证婚词
2014/01/10 职场文书
初婚未育未抱养证明
2014/01/12 职场文书
《雨霖铃》教学反思
2014/02/22 职场文书
项目采购员岗位职责
2014/04/15 职场文书
学术诚信承诺书
2014/05/26 职场文书
高三语文复习计划
2015/01/19 职场文书
财产分割协议书
2016/03/22 职场文书
pandas提升计算效率的一些方法汇总
2021/05/30 Python