基于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 相关文章推荐
jQuery 获取对象 基本选择与层级
May 31 Javascript
5个javascript的数字格式化函数分享
Dec 07 Javascript
一个简单的jquery进度条示例
Apr 28 Javascript
详解JavaScript的Polymer框架中的通知交互
Jul 29 Javascript
Jquery实现仿京东商城省市联动菜单
Nov 19 Javascript
Angular中实现树形结构视图实例代码
May 05 Javascript
vue拖拽组件使用方法详解
Dec 01 Javascript
配置eslint规范项目代码风格
Mar 11 Javascript
小程序server请求微信服务器超时的解决方法
May 21 Javascript
layui radio单选限制下一个radio单选的实例
Sep 03 Javascript
vue图片上传组件使用详解
Dec 23 Javascript
vue基于Teleport实现Modal组件
May 31 Vue.js
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 Smarty模板生成html文档的方法
2010/04/12 PHP
PHP实现文件下载断点续传详解
2014/10/15 PHP
PHP 反射(Reflection)使用实例
2015/05/12 PHP
php禁用cookie后session设置方法分析
2016/10/19 PHP
php链式操作的实现方式分析
2019/08/12 PHP
JavaScript-世界上误解最深的语言分析
2007/08/12 Javascript
检测input每次的输入是否合法遇到汉字输入就有问题
2012/05/23 Javascript
jquery easyui中treegrid用法的简单实例
2014/02/18 Javascript
AngularJS基础知识笔记之表格
2015/05/10 Javascript
鼠标经过子元素触发mouseout,mouseover事件的解决方案
2015/07/26 Javascript
jQuery鼠标经过方形图片切换成圆边效果代码分享
2015/08/20 Javascript
详解Bootstrap glyphicons字体图标
2016/01/04 Javascript
vue-cli webpack2项目打包优化分享
2018/02/07 Javascript
jQuery实现鼠标滑过商品小图片上显示对应大图片功能【测试可用】
2018/04/27 jQuery
基于Express框架使用POST传递Form数据
2019/08/10 Javascript
详解webpack-dev-middleware 源码解读
2020/03/23 Javascript
[04:41]2014DOTA2国际邀请赛 Liquid顺利突围晋级正赛
2014/07/09 DOTA
[02:05]2014DOTA2西雅图邀请赛 专访啸天mik夫妻档
2014/07/08 DOTA
用Python编写简单的微博爬虫
2016/03/04 Python
Python实现SMTP发送邮件详细教程
2021/03/02 Python
python使用正则表达式的search()函数实现指定位置搜索功能
2017/11/10 Python
python实现将一个数组逆序输出的方法
2018/06/25 Python
python生成n个元素的全组合方法
2018/11/13 Python
python抓取网页内容并进行语音播报的方法
2018/12/24 Python
PyQt5实现简易电子词典
2019/06/25 Python
python二元表达式用法
2019/12/04 Python
Html5新标签解释及用法
2012/02/17 HTML / CSS
美国女士时尚珠宝及配饰购物网站:Icing
2018/07/02 全球购物
linux面试题参考答案(2)
2015/12/06 面试题
儿科护理实习自我鉴定
2013/09/19 职场文书
毕业求职自荐信格式是什么
2013/11/19 职场文书
优秀学生事迹材料
2014/02/08 职场文书
2016年五一国际劳动节活动总结
2016/04/06 职场文书
廉政党课工作报告案例
2019/06/21 职场文书
Vue中插槽slot的使用方法与应用场景详析
2021/06/08 Vue.js
TV动画《间谍过家家》公开PV
2022/03/20 日漫