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动态添加option和删除option(附实例代码)
Apr 01 Javascript
ExtJS实现文件下载的方法实例
Nov 09 Javascript
js获取日期:昨天今天和明天、后天
Jun 11 Javascript
Node.js中使用mongoskin操作mongoDB实例
Sep 28 Javascript
node.js的事件机制
Feb 08 Javascript
jQuery实现简单的滑动导航代码(移动端)
May 22 jQuery
JavaScript实现三级联动菜单效果
Aug 16 Javascript
关于微信小程序bug记录与解决方法
Aug 15 Javascript
vue组件开发之用户无限添加自定义填写表单的方法
Aug 28 Javascript
使用JavaScript获取Django模板指定键值数据
May 27 Javascript
详解vue v-model
Aug 31 Javascript
vue print.js打印支持Echarts图表操作
Nov 13 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
《DOTA3》开发工作已经开始 《DOTA3》将代替《DOTA2》
2021/03/06 DOTA
PHP中通过加号合并数组的一个简单方法分享
2011/01/27 PHP
一些php技巧与注意事项分析
2011/02/03 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
2014/06/19 PHP
php银联网页支付实现方法
2015/03/04 PHP
PHP微信支付实例解析
2016/07/22 PHP
jquery实现滑屏大图定时收缩为小banner图片的广告代码
2015/09/02 Javascript
基于jQuery实现仿QQ空间送礼物功能代码
2016/05/24 Javascript
node文件上传功能简易实现代码
2017/06/16 Javascript
Nodejs 和Session 原理及实战技巧小结
2017/08/25 NodeJs
基于JS实现html中placeholder属性提示文字效果示例
2018/04/19 Javascript
Vue多环境代理配置方法思路详解
2019/06/21 Javascript
微信小程序iOS下拉白屏晃动问题解决方案
2019/10/12 Javascript
vue.js 子组件无法获取父组件store值的解决方式
2019/11/08 Javascript
js实现旋转木马轮播图效果
2020/01/10 Javascript
微信小程序中的列表切换功能实例代码详解
2020/06/09 Javascript
[01:01:43]EG vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
[02:03]完美世界DOTA2联赛10月30日赛事集锦
2020/10/31 DOTA
linux系统使用python监控apache服务器进程脚本分享
2014/01/15 Python
python回调函数的使用方法
2014/01/23 Python
python显示生日是星期几的方法
2015/05/27 Python
python发送邮件功能实现代码
2016/07/15 Python
详解Python自建logging模块
2018/01/29 Python
使用python生成目录树
2018/03/29 Python
python使用rpc框架gRPC的方法
2018/08/24 Python
python获取linux系统信息的三种方法
2020/10/14 Python
美国婚礼礼品网站:MyWeddingFavors
2018/09/26 全球购物
New Balance比利时官方网站:购买鞋子和服装
2021/01/15 全球购物
LUISAVIAROMA中国官网:时尚奢侈品牌购物网站
2020/11/01 全球购物
工程造价管理专业大专生求职信
2013/10/06 职场文书
研发工程师的岗位职责
2013/11/18 职场文书
安全责任书范文
2014/03/12 职场文书
好听的队名和口号
2014/06/09 职场文书
《悲惨世界》:比天空更广阔的是人的心灵
2020/01/16 职场文书
Matplotlib可视化之添加让统计图变得简单易懂的注释
2021/06/11 Python
java设计模式--建造者模式详解
2021/07/21 Java/Android