基于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 相关文章推荐
javascript 添加和移除函数的通用方法
Oct 20 Javascript
js判断上传文件的类型和大小示例代码
Oct 18 Javascript
jQuery替换textarea中换行的方法
Jun 10 Javascript
jQuery+CSS实现的网页二级下滑菜单效果
Aug 25 Javascript
jQuery插件Flexslider实现图片轮播、图文结合滑动切换效果
Apr 16 Javascript
jQuery实现的手风琴侧边菜单效果
Mar 29 jQuery
React实践之Tree组件的使用方法
Sep 30 Javascript
vue组件中使用props传递数据的实例详解
Apr 08 Javascript
微信小程序canvas.drawImage完全显示图片问题的解决
Nov 30 Javascript
vue tab切换,解决echartst图表宽度只有100px的问题
Jul 19 Javascript
vue 项目软键盘回车触发搜索事件
Sep 09 Javascript
在vant中使用时间选择器和popup弹出层的操作
Nov 04 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写UltraEdit插件脚本实现方法
2011/12/26 PHP
php使用sql server验证连接数据库的方法
2014/12/25 PHP
php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)
2016/05/12 PHP
PHP文件操作详解
2016/12/30 PHP
PHP PDOStatement::bindColumn讲解
2019/01/30 PHP
javascript 运算数的求值顺序
2011/08/23 Javascript
jquery实现漂浮在网页右侧的qq在线客服插件示例
2013/05/13 Javascript
jQuery事件之键盘事件(ctrl+Enter回车键提交表单等)
2014/05/11 Javascript
实例讲解JQuery中this和$(this)区别
2014/12/08 Javascript
js实现表单检测及表单提示的方法
2015/08/14 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
2015/08/21 Javascript
jquery 将当前时间转换成yyyymmdd格式的实现方法
2016/06/01 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
2020/10/26 Javascript
Vue+axios 实现http拦截及路由拦截实例
2017/04/25 Javascript
Vue仿支付宝支付功能
2018/05/25 Javascript
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
python之wxPython应用实例
2014/09/28 Python
跟老齐学Python之编写类之二方法
2014/10/11 Python
Zabbix实现微信报警功能
2016/10/09 Python
利用pyinstaller将py文件打包为exe的方法
2018/05/14 Python
Python3.5集合及其常见运算实例详解
2019/05/01 Python
pandas 数据索引与选取的实现方法
2019/06/21 Python
Python中那些 Pythonic的写法详解
2019/07/02 Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
2019/07/31 Python
Python命令行参数解析工具 docopt 安装和应用过程详解
2019/09/26 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
2020/01/08 Python
Pycharm插件(Grep Console)自定义规则输出颜色日志的方法
2020/05/27 Python
Python创建简单的神经网络实例讲解
2021/01/04 Python
vue路由实现登录拦截
2021/03/24 Vue.js
工商管理自荐书
2014/07/06 职场文书
2014年政府采购工作总结
2014/12/09 职场文书
2015年员工试用期工作总结
2015/05/28 职场文书
2015暑假实习报告范文
2015/07/13 职场文书
2015年教师节广播稿
2015/08/19 职场文书
python playwright 自动等待和断言详解
2021/11/27 Python
Vue的生命周期一起来看看
2022/02/24 Vue.js