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 相关文章推荐
javascript奇异的arguments分析
Oct 20 Javascript
jQuery JSON实现无刷新三级联动实例探讨
May 28 Javascript
node.js中的buffer.fill方法使用说明
Dec 14 Javascript
向JavaScript的数组中添加元素的方法小结
Oct 24 Javascript
谈谈jQuery Ajax用法详解
Nov 27 Javascript
JavaScript:Date类型全面解析
May 19 Javascript
node.js报错:Cannot find module 'ejs'的解决办法
Dec 14 Javascript
jquery实现手机端单店铺购物车结算删除功能
Feb 22 Javascript
详解利用jsx写vue组件的方法示例
Jul 17 Javascript
JavaScript中重名的函数与对象示例详析
Sep 28 Javascript
详解小程序rich-text对富文本支持方案
Nov 28 Javascript
简单了解JavaScript arguement原理及作用
May 28 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查询域名状态whois的类
2006/11/25 PHP
用phpmyadmin更改mysql5.0登录密码
2008/03/25 PHP
php 生成饼图 三维饼图
2009/09/28 PHP
PHP无刷新上传文件实现代码
2011/09/19 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
2014/06/26 PHP
PHP操作文件的一些基本函数使用示例
2014/11/18 PHP
php查询mssql出现乱码的解决方法
2014/12/29 PHP
php实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
PHP数组array类常见操作示例
2020/05/15 PHP
jQuery学习笔记(2)--用jquery实现各种模态提示框代码及项目构架
2013/04/08 Javascript
js取消单选按钮选中并判断对象是否为空
2013/11/14 Javascript
移动设备web开发首选框架:zeptojs介绍
2015/01/29 Javascript
js面向对象之公有、私有、静态属性和方法详解
2015/04/17 Javascript
15位和18位身份证JS校验的简单实例
2016/07/18 Javascript
微信和qq时间格式模板实例详解
2016/10/21 Javascript
js中less常用的方法小结
2017/08/09 Javascript
jquery判断滚动条距离顶部的距离方法
2018/09/05 jQuery
深入浅析javascript函数中with
2018/10/28 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
2019/05/21 Javascript
JavaScript实现多文件下载方法解析
2020/08/07 Javascript
解决VUE项目localhost端口服务器拒绝连接,只能用127.0.0.1的问题
2020/08/14 Javascript
JavaScript 几种循环方式以及模块化的总结
2020/09/03 Javascript
python多线程threading.Lock锁用法实例
2014/11/01 Python
Python max内置函数详细介绍
2016/11/17 Python
Python中asyncio模块的深入讲解
2019/06/10 Python
华为校园招聘上机笔试题 扑克牌大小(python)
2020/04/22 Python
如何在Python 游戏中模拟引力
2020/03/27 Python
基于python实现上传文件到OSS代码实例
2020/05/09 Python
AmazeUI 导航条的实现示例
2020/08/14 HTML / CSS
什么是数据库锁?Oracle中都有哪些类型的锁?
2015/08/21 面试题
出国导师推荐信
2014/01/16 职场文书
学雷锋先进个人事迹
2014/05/26 职场文书
幼儿园教师求职信
2015/03/20 职场文书
工作失职自我检讨书
2015/05/05 职场文书
初二数学教学反思
2016/02/17 职场文书
Python字典的基础操作
2021/11/01 Python