基于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的MessageBox
Dec 03 Javascript
js实现图片放大缩小功能后进行复杂排序的方法
Nov 08 Javascript
JS判断变量是否为空判断是否null
Jul 25 Javascript
Javascript基础教程之变量
Jan 18 Javascript
jQuery计算文本框字数及限制文本框字数的方法
Mar 01 Javascript
IE和Firefox之间在JavaScript语法上的差异
Apr 22 Javascript
jQuery插件 Jqplot图表实例
Jun 18 Javascript
Web性能优化系列 10个提升JavaScript性能的技巧
Sep 27 Javascript
关于iframe跨域POST提交的方法示例
Jan 15 Javascript
vue 点击按钮实现动态挂载子组件的方法
Sep 07 Javascript
使用JavaScript破解web
Sep 28 Javascript
JS/jQuery实现超简单的Table表格添加,删除行功能示例
Jul 31 jQuery
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
改变Apache端口等配置修改方法
2008/06/05 PHP
php zend 相对路径问题
2009/01/12 PHP
一个很不错的PHP翻页类
2009/06/01 PHP
php 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
php 获取一个月第一天与最后一天的代码
2010/05/16 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
2015/09/14 PHP
PHP数据库处理封装类实例
2016/12/24 PHP
php实现的简单中文验证码功能示例
2017/01/03 PHP
详解如何实现Laravel的服务容器的方法示例
2019/04/15 PHP
PHP使用Session实现上传进度功能详解
2019/08/06 PHP
laravel添加前台跳转成功页面示例
2019/10/22 PHP
js自执行函数的几种不同写法的比较
2012/08/16 Javascript
如何创建一个JavaScript弹出DIV窗口层的效果
2013/09/25 Javascript
JavaScript iframe数据共享接口实现方法
2016/01/06 Javascript
jquery实现跳到底部,回到顶部效果的简单实例(类似锚)
2016/07/10 Javascript
js倒计时小实例(多次定时)
2016/12/08 Javascript
jQuery实现动态添加tr到table的方法
2016/12/26 Javascript
jQuery实现的省市联动菜单功能示例【测试可用】
2017/01/13 Javascript
Angular 2.x学习教程之结构指令详解
2017/05/25 Javascript
详解Node项目部署到云服务器上
2017/07/12 Javascript
vue keep-alive请求数据的方法示例
2018/05/16 Javascript
vue实现自定义多选与单选的答题功能
2018/07/05 Javascript
关于vue v-for循环解决img标签的src动态绑定问题
2018/09/18 Javascript
微信小程序文章详情功能完整实例
2020/06/03 Javascript
Vue看了就会的8个小技巧
2021/01/21 Vue.js
Python遍历目录中的所有文件的方法
2016/07/08 Python
Python网络爬虫出现乱码问题的解决方法
2017/01/05 Python
python模块之time模块(实例讲解)
2017/09/13 Python
Django 限制用户访问频率的中间件的实现
2018/08/23 Python
python opencv根据颜色进行目标检测的方法示例
2020/01/15 Python
scrapy redis配置文件setting参数详解
2020/11/18 Python
计算机专业职业生涯规划范文
2014/01/19 职场文书
世界文化遗产导游词
2015/02/13 职场文书
2015年学生会纪检部工作总结
2015/03/31 职场文书
2015年招生工作总结
2015/05/04 职场文书
2016大一新生军训心得体会
2016/01/11 职场文书