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宝典学习笔记
Feb 07 Javascript
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
Aug 28 Javascript
JsDom 编程小结
Aug 09 Javascript
Knockout数组(observable)使用详解示例
Nov 15 Javascript
For循环中分号隔开的3部分的执行顺序探讨
May 27 Javascript
JavaScript中isPrototypeOf函数作用和使用实例
Jun 01 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
Oct 06 Javascript
jquery实现表格隔行换色效果
Nov 19 Javascript
Bootstrap每天必学之标签页(Tab)插件
Aug 09 Javascript
js倒计时简单实现代码
Aug 11 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
Feb 01 Javascript
Javascript生成器(Generator)的介绍与使用
Jan 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
MYSQL环境变量设置方法
2007/01/15 PHP
php验证码生成代码
2015/11/11 PHP
Laravle eloquent 多对多模型关联实例详解
2017/11/22 PHP
$()JS小技巧
2007/07/21 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
jquery重新播放css动画所遇问题解决
2013/08/21 Javascript
javascript实现浏览器窗口传递参数的方法
2014/09/03 Javascript
JavaScript根据CSS的Media Queries来判断浏览设备的方法
2016/05/10 Javascript
原生js实现可爱糖果数字时间特效
2016/12/30 Javascript
使用Require.js封装原生js轮播图的实现代码
2017/06/15 Javascript
基于jquery trigger函数无法触发a标签的两种解决方法
2018/01/06 jQuery
Vue精简版风格指南(推荐)
2018/01/30 Javascript
LayUi使用switch开关,动态的去控制它是否被启用的方法
2019/09/21 Javascript
[04:37]DOTA2英雄梦之声Vol20发条
2014/06/20 DOTA
详解python时间模块中的datetime模块
2016/01/13 Python
详解python发送各类邮件的主要方法
2016/12/22 Python
使用pyecharts无法import Bar的解决方案
2020/04/23 Python
python django 增删改查操作 数据库Mysql
2017/07/27 Python
python学习教程之使用py2exe打包
2017/09/24 Python
Python 装饰器实现DRY(不重复代码)原则
2018/03/05 Python
python celery分布式任务队列的使用详解
2019/07/08 Python
Python 3.8正式发布重要新功能一览
2019/10/17 Python
基于Python实现扑克牌面试题
2019/12/11 Python
香港莎莎官网Sasa.com:亚洲著名国际化妆品商城
2019/11/10 全球购物
Deux par Deux官方网站:设计师童装
2020/01/03 全球购物
触发器(trigger)的功能都有哪些?写出一个触发器的例子
2012/09/17 面试题
司机辞职报告范文
2014/01/20 职场文书
简历里的自我评价范文
2014/02/24 职场文书
服务型党组织建设典型材料
2014/05/07 职场文书
试用期员工工作自我评价
2014/09/10 职场文书
2014年计生协会工作总结
2014/11/21 职场文书
优秀班主任事迹材料
2014/12/16 职场文书
公司人事管理制度
2015/08/05 职场文书
《认识年月日》教学反思
2016/02/19 职场文书
在项目中使用redis做缓存的一些思路
2021/09/14 Redis
postgreSQL数据库基础知识介绍
2022/04/12 PostgreSQL