基于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 相关文章推荐
表单的焦点顺序tabindex和对应enter键提交
Jan 04 Javascript
node.js正则表达式获取网页中所有链接的代码实例
Jun 03 Javascript
Javascript实现多彩雪花从天降散落效果的方法
Feb 02 Javascript
javascript下拉框选项单击事件的例子分享
Mar 04 Javascript
JavaScript运行过程中的“预编译阶段”和“执行阶段”
Dec 16 Javascript
微信小程序  wx.request合法域名配置详解
Nov 23 Javascript
JS html时钟制作代码分享
Mar 03 Javascript
鼠标经过出现气泡框的简单实例
Mar 17 Javascript
简单谈谈原生js的math对象
Jun 27 Javascript
js自定义弹框插件的封装
Aug 24 Javascript
vue 中使用 watch 出现了如下的报错的原因分析
May 21 Javascript
微信小程序实现点击空白隐藏的方法示例
Aug 13 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默认安装产生系统漏洞
2006/10/09 PHP
一个显示天气预报的程序
2006/10/09 PHP
PHP 类型转换函数intval
2009/06/20 PHP
php学习之 数组声明
2011/06/09 PHP
php与java通过socket通信的实现代码
2013/10/21 PHP
php stripslashes和addslashes的区别
2014/02/03 PHP
php通过隐藏表单控件获取到前两个页面的url
2014/09/09 PHP
五款PHP代码重构工具推荐
2014/10/14 PHP
php 魔术方法详解
2014/11/11 PHP
php实现的美国50个州选择列表实例
2015/04/20 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
2018/04/20 PHP
js压缩利器
2007/02/20 Javascript
基于jQuery的自动完成插件
2011/02/03 Javascript
javascript实现点击按钮让DIV层弹性移动的方法
2015/02/24 Javascript
bootstrap学习笔记之初识bootstrap
2016/06/21 Javascript
javascript中apply/call和bind的使用
2017/02/15 Javascript
vue 全选与反选的实现方法(无Bug 新手看过来)
2018/02/09 Javascript
使用sessionStorage解决vuex在页面刷新后数据被清除的问题
2018/04/13 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
2019/05/18 Javascript
解决layui的form里的元素进行动态生成,验证失效的问题
2019/09/14 Javascript
[01:04:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第二场 1月31日
2021/03/11 DOTA
python url 参数修改方法
2018/12/26 Python
对Python+opencv将图片生成视频的实例详解
2019/01/08 Python
python opencv对图像进行旋转且不裁剪图片的实现方法
2019/07/09 Python
用Python实现BP神经网络(附代码)
2019/07/10 Python
详解python实现小波变换的一个简单例子
2019/07/18 Python
Python生成个性签名图片获取GUI过程解析
2019/12/16 Python
OpenCV 之按位运算举例解析
2020/06/19 Python
button在IE6/7下的黑边去除方案
2012/12/24 HTML / CSS
Foot Locker加拿大官网:美国知名运动产品零售商
2019/07/21 全球购物
学校办公室主任职责
2013/12/27 职场文书
机关会计岗位职责
2014/04/08 职场文书
小学科学教学计划
2015/01/21 职场文书
2015年国庆节活动总结
2015/03/23 职场文书
Windows下使用Nginx+Tomcat做负载均衡的完整步骤
2021/03/31 Servers
vue实现书本翻页动画效果实例详解
2022/04/08 Vue.js