基于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 相关文章推荐
类之Prototype.js学习
Jun 13 Javascript
原生javascript兼容性测试实例
Jul 01 Javascript
jQuery实现隔行背景色变色
Nov 24 Javascript
Angularjs中UI Router全攻略
Jan 29 Javascript
JS实现的跨浏览器解析XML文件实例
Jun 21 Javascript
jQuery实现复制到粘贴板功能
Feb 11 Javascript
jQuery dateRangePicker插件使用方法详解
Jul 28 jQuery
js装饰设计模式学习心得
Feb 17 Javascript
Angular5中状态管理的实现
Sep 03 Javascript
vuex vue简单使用知识点总结
Aug 29 Javascript
Angular5整合富文本编辑器TinyMCE的方法(汉化+上传)
May 26 Javascript
如何使用JavaScript策略模式校验表单
Apr 29 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音乐采集(部分代码)
2007/02/14 PHP
dedecms系统常用术语汇总
2007/04/03 PHP
解析php DOMElement 操作xml 文档的实现代码
2013/05/10 PHP
thinkphp 验证码 的使用小结
2017/05/07 PHP
Laravel框架控制器,视图及模型操作图文详解
2019/12/04 PHP
摘自百度的图片轮换效果代码
2007/11/19 Javascript
如何用JavaScript动态呼叫函数(两种方式)
2013/05/03 Javascript
js 获取、清空input type=&quot;file&quot;的值示例代码
2014/02/19 Javascript
js实现日历可获得指定日期周数及星期几示例分享(js获取星期几)
2014/03/14 Javascript
使用jquery.validate自定义方法实现&quot;手机号码或者固话至少填写一个&quot;的逻辑验证
2014/09/01 Javascript
javascript白色简洁计算器
2015/05/04 Javascript
EasyUI Pagination 分页的两种做法小结
2016/07/09 Javascript
基于Angular.js实现的触摸滑动动画实例代码
2017/02/19 Javascript
VSCode配置react开发环境的步骤
2017/12/27 Javascript
浏览器调试动态js脚本的方法(图解)
2018/01/19 Javascript
JS实现为动态创建的元素添加事件操作示例
2018/03/17 Javascript
解决layui表格的表头不滚动的问题
2019/09/04 Javascript
Vue.set 全局操作简单示例
2019/09/19 Javascript
[02:09]抵达西雅图!中国军团加油!
2014/07/07 DOTA
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
[06:07]DOTA2-DPC中国联赛 正赛 Ehome vs VG 选手采访
2021/03/11 DOTA
Python中生成器和yield语句的用法详解
2015/04/17 Python
Python实现给文件添加内容及得到文件信息的方法
2015/05/28 Python
python-pyinstaller、打包后获取路径的实例
2019/06/10 Python
Python中的引用和拷贝实例解析
2019/11/14 Python
python实现简单飞行棋
2020/02/06 Python
python图形界面开发之wxPython树控件使用方法详解
2020/02/24 Python
工程业务员岗位职责
2013/12/31 职场文书
市场营销管理制度
2014/01/29 职场文书
企业总经理任命书
2014/06/05 职场文书
汉语言文学毕业求职信
2014/07/17 职场文书
求职自我推荐信
2015/03/24 职场文书
党小组考察意见
2015/06/02 职场文书
论语读书笔记
2015/06/26 职场文书
2019大学生社会实践报告汇总
2019/08/16 职场文书
SQLServer权限之只开启创建表权限
2022/04/12 SQL Server