基于JavaScript实现的折半查找算法示例


Posted in Javascript onApril 14, 2017

本文实例讲述了基于JavaScript实现的折半查找算法。分享给大家供大家参考,具体如下:

折半查找也叫做二分查找,是针对有序表的一种查找方式,其思想如下:

将数组的第一个位置设为下边界;

将数组的最后一个位置设为上边界;

如果下边界等于或小于上边界,则做如下操作:

   将中点设置为上边界加下边界之和除以二;
   如果中点的元素小于查询的值,则将下边界设置为中点元素所在下标加1;
   如果中点的元素大于查询的值,则将上边界设置为中点元素所在下标减1;
   否则中点元素即为要查找的元素,可以进行返回。

折半查找代码如下:

function binSearch(arr,data){//折半查找,也叫二分查找
    var upperBound=arr.length-1;
    var lowerBound=0;
    while(lowerBound<=upperBound){//未遍历完
      var mid=Math.floor((lowerBound+upperBound)/2);
      document.write("当前中点为:"+mid+'<br>');//记录选中的中点
      if(arr[mid]<data){
        lowerBound=mid+1;
      }else if(arr[mid]>data){
        upperBound=mid-1;
      }else{
        return mid;
      }
    }
    return -1;
}

那么出现了重复的,我们需要计数。计数的思想就是在找到点的位置左右开始遍历,找到相同的则计数,找到不同的则停止遍历,代码如下:

function count(arr,data){//计算重复出现的次数
    var count=0;
    var position=binSearch(arr,data);//找出值所在位置
    if(position>-1){
      count++;//找到后,往左右一次遍历直到找到不同值后break
      for(var i=position-1;i>0;i--){
        if(arr[i]==data){
          count++;
        }else{
          break;
        }
      }
      for(var i=position+1;i<arr.length;i++){
        if(arr[i]==data){
          count++;
        }else{
          break;
        }
      }
    }
    return count;
}

最后是实验:

//实验
var nums=[1,2,2,3,3,4,5,6,7,8,9,10,11];
var bool=binSearch(nums,3);
document.write("所在位置为:"+bool+"<br>");
document.write("含有个数为:"+count(nums,3));
//当前中点为:6
//当前中点为:2
//当前中点为:4
//所在位置为:4
//当前中点为:6
//当前中点为:2
//当前中点为:4
//含有个数为:2

完整代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>JavaScript折半查找</title>
  </head>
  <body>
<script type="text/javascript">
  function binSearch(arr,data){//折半查找,也叫二分查找
    var upperBound=arr.length-1;
    var lowerBound=0;
    while(lowerBound<=upperBound){//未遍历完
      var mid=Math.floor((lowerBound+upperBound)/2);
      document.write("当前中点为:"+mid+'<br>');//记录选中的中点
      if(arr[mid]<data){
        lowerBound=mid+1;
      }else if(arr[mid]>data){
        upperBound=mid-1;
      }else{
        return mid;
      }
    }
    return -1;
  }
  function count(arr,data){//计算重复出现的次数
    var count=0;
    var position=binSearch(arr,data);//找出值所在位置
    if(position>-1){
      count++;//找到后,往左右一次遍历直到找到不同值后break
      for(var i=position-1;i>0;i--){
        if(arr[i]==data){
          count++;
        }else{
          break;
        }
      }
      for(var i=position+1;i<arr.length;i++){
        if(arr[i]==data){
          count++;
        }else{
          break;
        }
      }
    }
    return count;
  }
  //实验
  var nums=[1,2,2,3,3,4,5,6,7,8,9,10,11];
  var bool=binSearch(nums,3);
  document.write("所在位置为:"+bool+"<br>");
  document.write("含有个数为:"+count(nums,3));
  //当前中点为:6
  //当前中点为:2
  //当前中点为:4
  //所在位置为:4
  //当前中点为:6
  //当前中点为:2
  //当前中点为:4
  //含有个数为:2
</script>
  </body>
</html>

运行效果图如下:

基于JavaScript实现的折半查找算法示例

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
新鲜出炉的js tips提示效果
Apr 03 Javascript
javascript实现网页屏蔽Backspace事件,输入框不屏蔽
Jul 21 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
Aug 05 Javascript
jQuery中each()、find()和filter()等节点操作方法详解(推荐)
May 25 Javascript
特殊日期提示功能的实现方法
Jun 16 Javascript
JS使用onerror捕获异常示例
Aug 03 Javascript
jQuery easyui刷新当前tabs的方法
Sep 23 Javascript
Jquery Easyui对话框组件Dialog使用详解(14)
Dec 19 Javascript
Node.js之readline模块的使用详解
Mar 25 Javascript
node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)
Apr 10 Javascript
javascript实现简单打字游戏
Oct 29 Javascript
Vue自定义多选组件使用详解
Sep 08 Javascript
AngularJS之自定义服务详解(factory、service、provider)
Apr 14 #Javascript
基于JavaScript实现的顺序查找算法示例
Apr 14 #Javascript
vue组件中点击按钮后修改输入框的状态实例代码
Apr 14 #Javascript
angularjs实现首页轮播图效果
Apr 14 #Javascript
如何使用bootstrap框架 bootstrap入门必看!
Apr 13 #Javascript
微信小程序 下拉菜单简单实例
Apr 13 #Javascript
微信小程序 实现列表项滑动显示删除按钮的功能
Apr 13 #Javascript
You might like
PHP 文件编程综合案例-文件上传的实现
2013/07/03 PHP
php比较两个绝对时间的大小
2014/01/31 PHP
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
PHP中substr()与explode()函数用法分析
2014/11/24 PHP
详谈php中 strtr 和 str_replace 的效率问题
2017/05/14 PHP
基于ThinkPHP删除目录及目录文件函数
2020/10/28 PHP
jquer之ajaxQueue简单实现代码
2011/09/15 Javascript
jQuery实现为图片添加镜头放大效果的方法
2015/06/25 Javascript
js去字符串前后空格的实现方法
2016/02/26 Javascript
AngularJS全局警告框实现方法示例
2017/05/18 Javascript
js实现canvas图片与img图片的相互转换的示例
2017/08/31 Javascript
JS闭包的几种常见形式实例详解
2017/09/16 Javascript
实例学习JavaScript读取和写入cookie
2018/01/29 Javascript
记React connect的几种写法(小结)
2018/09/18 Javascript
js实现一个页面多个倒计时的3种方法
2019/02/25 Javascript
jQuery实现提交表单时不提交隐藏div中input的方法
2019/10/08 jQuery
vue实现图片懒加载的方法分析
2020/02/05 Javascript
node.js使用yargs处理命令行参数操作示例
2020/02/11 Javascript
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
2020/08/27 Javascript
[07:43]《辉夜杯》公开赛晋级外卡赛战队—TRG训练生活探秘
2015/12/11 DOTA
[54:05]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第一场 1月9日
2021/03/11 DOTA
Python入门之modf()方法的使用
2015/05/15 Python
Python爬虫天气预报实例详解(小白入门)
2018/01/24 Python
python如何通过twisted实现数据库异步插入
2018/03/20 Python
使用tensorflow实现线性回归
2018/09/08 Python
pygame实现雷电游戏雏形开发
2018/11/20 Python
在Keras中实现保存和加载权重及模型结构
2020/06/15 Python
Python unittest基本使用方法代码实例
2020/06/29 Python
详解appium自动化测试工具(monitor、uiautomatorviewer)
2021/01/27 Python
马来西亚网上美容店:Hermo.my
2017/11/25 全球购物
食品安全责任书
2014/04/15 职场文书
投资合作协议书
2014/04/17 职场文书
中秋节国旗下演讲稿
2014/09/13 职场文书
2015年秋季小学开学典礼主持词
2015/07/16 职场文书
优秀乡村医生事迹材料(2016精选版)
2016/02/29 职场文书
nginx反向代理时如何保持长连接
2021/03/31 Servers