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 相关文章推荐
Array.prototype 的泛型应用分析
Apr 30 Javascript
jquery实现人性化的有选择性禁用鼠标右键
Jun 30 Javascript
js倒计时简单实现方法
Dec 17 Javascript
全面接触神奇的Bootstrap导航条实战篇
Aug 01 Javascript
浅谈toLowerCase和toLocaleLowerCase的区别
Aug 15 Javascript
vuex的简单使用教程
Feb 02 Javascript
剖析Angular Component的源码示例
Mar 23 Javascript
elementUi vue el-radio 监听选中变化的实例代码
Jun 28 Javascript
jQuery实现的解析本地 XML 文档操作示例
Apr 30 jQuery
vue基础知识--axios合并请求和slot
Jun 04 Javascript
vue pages 多入口项目 + chainWebpack 全局引用缩写说明
Sep 21 Javascript
微信小程序实现列表左右滑动
Nov 19 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
再说下636单管机
2021/03/02 无线电
WordPress中用于检索模版的相关PHP函数使用解析
2015/12/15 PHP
如何判断php mysqli扩展类是否开启
2016/12/24 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
2017/05/02 PHP
javascript multibox 全选
2009/03/22 Javascript
Javascript 验证上传图片大小[客户端]
2009/08/01 Javascript
javascript循环变量注册dom事件 之强大的闭包
2010/09/08 Javascript
javascript AOP 实现ajax回调函数使用比较方便
2010/11/20 Javascript
ExtJS4 Grid改变单元格背景颜色及Column render学习
2013/02/06 Javascript
js登录弹出层特效
2014/03/07 Javascript
AngularJS学习笔记之TodoMVC的分析
2015/02/22 Javascript
javascript操作select元素实例分析
2015/03/27 Javascript
AngularJS基础 ng-model 指令详解及示例代码
2016/08/02 Javascript
BOM系列第二篇之定时器requestAnimationFrame
2016/08/17 Javascript
BootStrap入门教程(三)之响应式原理
2016/09/19 Javascript
妙用Angularjs实现表格按指定列排序
2017/06/23 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
微信小程序绑定手机号获取验证码功能
2019/10/22 Javascript
webpack打包html里面img后src为“[object Module]”问题
2019/12/22 Javascript
JS实现放烟花效果
2020/03/10 Javascript
JS原型prototype和__proto__用法实例分析
2020/03/14 Javascript
[02:03]永远的信仰DOTA2 中国军团历届国际邀请赛回顾
2016/06/26 DOTA
Python中类的初始化特殊方法
2017/12/01 Python
详解pandas删除缺失数据(pd.dropna()方法)
2019/06/25 Python
Python跳出多重循环的方法示例
2019/07/03 Python
乌克兰时尚鞋子和衣服购物网站:Born2be
2018/05/24 全球购物
小学防溺水制度
2014/01/29 职场文书
海飞丝广告词
2014/03/20 职场文书
教师廉洁自律承诺书
2014/05/26 职场文书
党员教师个人对照检查材料(群众路线)
2014/09/26 职场文书
校园广播稿100字
2014/10/06 职场文书
群众路线剖析材料(四风)
2014/11/05 职场文书
个人更名证明
2015/06/23 职场文书
2016年大学生党员承诺书
2016/03/24 职场文书
使用GO语言实现Mysql数据库CURD的简单示例
2021/08/07 Golang
redis lua限流算法实现示例
2022/07/15 Redis