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 的应用开发初探(mootools)
Dec 19 Javascript
js解析xml字符串和xml文档实现原理及代码(针对ie与火狐)
Feb 02 Javascript
JS文本框默认值处理详解
Jul 10 Javascript
jQuery中:only-child选择器用法实例
Jan 03 Javascript
Javascript中的方法链(Method Chaining)介绍
Mar 15 Javascript
jquery自定义插件开发之window的实现过程
May 06 Javascript
javascript工厂模式和构造函数模式创建对象方法解析
Dec 30 Javascript
vue实现选项卡及选项卡切换效果
Apr 24 Javascript
Vuex 单状态库与多模块状态库详解
Dec 11 Javascript
Vue 实现复制功能,不需要任何结构内容直接复制方式
Nov 09 Javascript
浅析微信小程序自定义日历组件及flex布局最后一行对齐问题
Oct 29 Javascript
JavaScript点击按钮生成4位随机验证码
Jan 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实现导出excel数据的类库用法示例
2016/10/15 PHP
用jquery实现下拉菜单效果的代码
2010/07/25 Javascript
Js 代码中,ajax请求地址后加随机数防止浏览器缓存的原因
2013/05/07 Javascript
jQuery使用ajaxSubmit()提交表单示例
2014/04/04 Javascript
jquery form 隐藏的input 选择
2014/04/29 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
javascript中的this详解
2014/12/08 Javascript
JavaScript数组和循环详解
2015/04/27 Javascript
javascript实现一个数值加法函数
2015/06/26 Javascript
js实现select二级联动下拉菜单
2020/04/17 Javascript
javascript表单事件处理方法详解
2016/05/15 Javascript
Javascript中浏览器窗口的基本操作总结
2016/08/18 Javascript
WebView启动支付宝客户端支付失败的问题小结
2017/01/11 Javascript
vue-devtools的安装步骤
2018/04/23 Javascript
说说如何在Vue.js中实现数字输入组件的方法
2019/01/08 Javascript
vue 实现特定条件下绑定事件
2019/11/09 Javascript
使用Python脚本来获取Cisco设备信息的示例
2015/05/04 Python
Python判断直线和矩形是否相交的方法
2015/07/14 Python
浅谈机器学习需要的了解的十大算法
2017/12/15 Python
Django objects的查询结果转化为json的三种方式的方法
2018/11/07 Python
python 实现调用子文件下的模块方法
2018/12/07 Python
解决Tensorflow sess.run导致的内存溢出问题
2020/02/05 Python
python操作redis数据库的三种方法
2020/09/10 Python
设计师家具购买和委托在线市场:Viyet
2016/11/16 全球购物
阿里云:Aliyun.com
2017/02/15 全球购物
沙特阿拉伯网上购物:Sayidaty Mall
2018/05/06 全球购物
Groupon荷兰官方网站:高达70%的折扣
2019/11/01 全球购物
计算机开发个人求职信范文
2013/09/26 职场文书
高级技校毕业生自荐信
2013/11/18 职场文书
高三地理教学反思
2014/01/11 职场文书
家长对学生的评语
2014/04/18 职场文书
助理政工师申报材料
2014/06/03 职场文书
小学见习报告
2015/06/23 职场文书
借钱欠条怎么写
2015/07/03 职场文书
python自动统计zabbix系统监控覆盖率的示例代码
2021/04/03 Python
如何用Navicat操作MySQL
2021/05/12 MySQL