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 showModalDialog模态对话框使用说明
Dec 31 Javascript
javascript 模拟坦克大战游戏(html5版)附源码下载
Apr 08 Javascript
处理文本部分内容的TextRange对象应用实例
Jul 29 Javascript
禁用页面部分JavaScript不是全部而是部分
Sep 03 Javascript
jQuery如何防止这种冒泡事件发生
Feb 27 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
Dec 13 Javascript
再谈Javascript中的基本类型和引用类型(推荐)
Jul 01 Javascript
JavaScript实现无刷新上传预览图片功能
Aug 02 Javascript
AngularJs用户输入动态模板XSS攻击示例详解
Apr 21 Javascript
微信小程序如何使用globalData的方法
Jun 06 Javascript
vue项目中使用bpmn-自定义platter的示例代码
May 11 Javascript
解决vue2中使用elementUi打包报错的问题
Sep 22 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用户指南-cookies部分
2006/10/09 PHP
PHP stripos()函数及注意事项的分析
2013/06/08 PHP
php使用curl发送json格式数据实例
2013/12/17 PHP
IIS6.0 开启Gzip方法及PHP Gzip函数分享
2014/06/08 PHP
ThinkPHP提示错误Fatal error: Allowed memory size的解决方法
2015/02/12 PHP
Linux操作系统安装LAMP环境
2015/06/26 PHP
javascript 隔行换色函数代码
2010/10/24 Javascript
JS 添加网页桌面快捷方式的代码详细整理
2012/12/27 Javascript
使用apply方法实现javascript中的对象继承
2013/12/16 Javascript
兼容主流浏览器的iframe自适应高度js脚本
2014/01/10 Javascript
解决html按钮切换绑定不同函数后点击时执行多次函数问题
2014/05/14 Javascript
JS中三目运算符和if else的区别分析与示例
2014/11/21 Javascript
30个经典的jQuery代码开发技巧
2014/12/15 Javascript
JS实现页面超时后自动跳转到登陆页面
2015/01/19 Javascript
三种方式实现瀑布流布局
2017/02/10 Javascript
浅谈jquery拼接字符串效率比较高的方法
2017/02/22 Javascript
jQuery回调方法使用示例
2017/06/26 jQuery
nuxt+axios解决前后端分离SSR的示例代码
2017/10/24 Javascript
浅谈mint-ui 填坑之路
2017/11/06 Javascript
vue element项目引入icon图标的方法
2018/06/06 Javascript
angular.js实现列表orderby排序的方法
2018/10/02 Javascript
详解Nuxt内导航栏的两种实现方式
2020/04/16 Javascript
Python内置数据类型详解
2014/08/18 Python
基于Python __dict__与dir()的区别详解
2017/10/30 Python
python迭代dict的key和value的方法
2018/07/06 Python
python调用百度语音识别实现大音频文件语音识别功能
2018/08/30 Python
Python2和Python3.6环境解决共存问题
2018/11/09 Python
python scatter散点图用循环分类法加图例
2019/03/19 Python
Django中使用Celery的方法步骤
2020/12/07 Python
英国领先的大码时装品牌之一:Elvi
2018/08/26 全球购物
小学教研工作制度
2014/01/15 职场文书
高三毕业寄语
2014/04/10 职场文书
健康状况证明模板
2014/10/23 职场文书
2014年医药代表工作总结
2014/11/22 职场文书
2015年学校综合治理工作总结
2015/07/20 职场文书
人代会简报
2015/07/21 职场文书