基于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获取下拉列表的值为null的解决方法
Mar 18 Javascript
使用pjax实现无刷新更改页面url
Feb 05 Javascript
JavaScript面向对象的实现方法小结
Apr 14 Javascript
Javascript实现获取及设置光标位置的方法
Jul 21 Javascript
JS实现的鼠标跟随代码(卡通手型点击效果)
Oct 26 Javascript
基于JavaScript实现通用tab选项卡(通用性强)
Jan 07 Javascript
理解Javascript图片预加载
Feb 23 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
Jan 04 Javascript
vue js秒转天数小时分钟秒的实例代码
Aug 08 Javascript
ES6基础之 Promise 对象用法实例详解
Aug 22 Javascript
深入浅出vue图片路径的实现
Sep 04 Javascript
JS实现小米轮播图
Sep 21 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中get_object_vars()方法用法实例
2015/02/08 PHP
PHP crc32()函数讲解
2019/02/14 PHP
php判断IP地址是否在多个IP段内
2020/08/18 PHP
jquery.validate使用攻略 第三部
2010/07/01 Javascript
深入理解JavaScript 闭包究竟是什么
2013/04/12 Javascript
fullpage.js全屏滚动插件使用实例
2016/09/06 Javascript
JS实现求数组起始项到终止项之和的方法【基于数组扩展函数】
2017/06/13 Javascript
vue引入ueditor及node后台配置详解
2018/01/03 Javascript
vue+element树组件 实现树懒加载的过程详解
2019/10/21 Javascript
vue props 单项数据流实例分享
2020/02/16 Javascript
[18:20]DOTA2 HEROS教学视频教你分分钟做大人-昆卡
2014/06/11 DOTA
[51:17]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python输出9*9乘法表的方法
2015/05/25 Python
Python编写一个闹钟功能
2017/07/11 Python
Python运行不显示DOS窗口的解决方法
2018/10/22 Python
对python中的try、except、finally 执行顺序详解
2019/02/18 Python
PyQt5 在label显示的图片中绘制矩形的方法
2019/06/17 Python
50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
2019/11/20 Python
Python中Flask-RESTful编写API接口(小白入门)
2019/12/11 Python
三个python爬虫项目实例代码
2019/12/28 Python
解决python中0x80072ee2错误的方法
2020/07/19 Python
python 利用Pyinstaller打包Web项目
2020/10/23 Python
CSS3制作炫酷的下拉菜单及弹起式选单的实例分享
2016/05/17 HTML / CSS
用HTML5中的Canvas结合公式绘制粒子运动的教程
2015/05/08 HTML / CSS
Melijoe美国官网:法国奢侈童装购物网站
2017/04/19 全球购物
Under Armour安德玛英国官网:美国高端运动科技品牌
2018/09/17 全球购物
Yahoo的PHP面试题
2014/05/26 面试题
2014年情人节活动方案
2014/02/16 职场文书
社区优秀志愿者先进事迹
2014/05/09 职场文书
北京奥运会口号
2014/06/21 职场文书
女生节标语
2014/06/26 职场文书
遗失说明具结保证书
2015/02/26 职场文书
小学生反邪教心得体会
2016/01/15 职场文书
七年级作文之冬景
2019/11/07 职场文书
jQuery ajax - getScript() 方法和getJSON方法
2021/05/14 jQuery
HTML基础详解(下)
2021/10/16 HTML / CSS