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中eval函数的使用方法与示例
Apr 09 Javascript
js option删除代码集合
Nov 12 Javascript
使用apply方法实现javascript中的对象继承
Dec 16 Javascript
JavaScript获得表单target属性的方法
Apr 02 Javascript
JS实现适合于后台使用的动画折叠菜单效果
Sep 21 Javascript
BootstrapValidator超详细教程(推荐)
Dec 07 Javascript
你不知道的 javascript【推荐】
Jan 08 Javascript
详解jQuery中ajax.load()方法
Jan 25 Javascript
jquery判断滚动条距离顶部的距离方法
Sep 05 jQuery
Node.js 多线程完全指南总结
Mar 27 Javascript
JS Math对象与Math方法实例小结
Jul 05 Javascript
JavaScript中关于预编译、作用域链和闭包的理解
Mar 31 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/12/02 PHP
PHP发送AT指令实例代码
2016/05/26 PHP
PHP中new static()与new self()的比较
2016/08/19 PHP
PHP基于单例模式编写PDO类的方法
2016/09/13 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
在IE下:float属性会影响offsetTop的取值
2006/12/22 Javascript
JSONP 跨域访问代理API-yahooapis实现代码
2012/12/02 Javascript
jQuery之自动完成组件的深入解析
2013/06/19 Javascript
js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别详解
2013/11/05 Javascript
JS控件ASP.NET的treeview控件全选或者取消(示例代码)
2013/12/16 Javascript
jQuery类选择器用法实例
2014/12/23 Javascript
JS实现简易刻度时钟示例代码
2017/03/11 Javascript
JavaScript中在光标处插入添加文本标签节点的详细方法
2017/03/22 Javascript
jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一
2017/05/26 jQuery
JS中使用textPath实现线条上的文字
2017/12/25 Javascript
基于webpack4搭建的react项目框架的方法
2018/06/30 Javascript
js的对象与函数详解
2019/01/21 Javascript
Javascript读取上传文件内容/类型/字节数
2019/04/30 Javascript
在Django的模型和公用函数中使用惰性翻译对象
2015/07/27 Python
Python使用自带的ConfigParser模块读写ini配置文件
2016/06/26 Python
Fabric 应用案例
2016/08/28 Python
Python给你的头像加上圣诞帽
2018/01/04 Python
python调用API实现智能回复机器人
2018/04/10 Python
Python识别html主要文本框过程解析
2020/02/18 Python
python实现猜数游戏(保存游戏记录)
2020/06/22 Python
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
2019/08/01 HTML / CSS
艺术家策划的室内设计:Curious Egg
2019/03/06 全球购物
Perfume’s Club澳大利亚官网:西班牙领先的在线美容店
2021/02/01 全球购物
Java里面Pass by value和Pass by Reference是什么意思
2016/05/02 面试题
ktv收银员岗位职责
2013/12/16 职场文书
马云的职业生涯规划之路
2014/01/01 职场文书
应届生自荐信范文
2014/02/21 职场文书
新手上路标语
2014/06/20 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书
唱歌比赛拉拉队口号
2015/12/25 职场文书
化工生产实习心得体会
2016/01/22 职场文书