基于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 相关文章推荐
获取URL地址中的文件名和参数的javascript代码
Sep 02 Javascript
JSON.parse()和JSON.stringify()使用介绍
Jun 20 Javascript
jQuery插件MixItUp实现动画过滤和排序
Apr 12 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
Sep 17 Javascript
js操作cookie保存浏览记录的方法
Dec 25 Javascript
理解javascript中Map代替循环
Feb 26 Javascript
如何通过js实现图片预览功能【附实例代码】
Mar 30 Javascript
jQuery实现点击行选中或取消CheckBox的方法
Aug 01 Javascript
Bootstrap CSS布局之代码
Dec 17 Javascript
红黑树的插入详解及Javascript实现方法示例
Mar 26 Javascript
vue实现未登录跳转到登录页面的方法
Jul 17 Javascript
vue实现商品加减计算总价的实例代码
Aug 12 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连接MySQL代码的参数说明
2008/06/07 PHP
教你如何使用php session
2013/10/28 PHP
ThinkPHP实现一键清除缓存方法
2014/06/26 PHP
php站内搜索关键词变亮的实现方法
2014/12/30 PHP
PHP判断是否为空的几个函数对比
2015/04/21 PHP
分享php分页的功能模块
2015/06/16 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
2017/03/15 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
2017/05/03 PHP
使用户点击后退按钮使效三行代码
2007/07/07 Javascript
不使用中间变量,交换int型的 a, b两个变量的值。
2010/10/29 Javascript
在JavaScript中重写jQuery对象的方法实例教程
2014/08/25 Javascript
简单实现JS对dom操作封装
2015/12/02 Javascript
关于JS中match() 和 exec() 返回值和属性的测试
2016/03/21 Javascript
jQuery qrcode生成二维码的方法
2016/04/03 Javascript
Bootstrap分页插件之Bootstrap Paginator实例详解
2016/10/15 Javascript
NodeJS整合银联网关支付(DEMO)
2016/11/09 NodeJs
纯JS实现弹性导航条效果
2017/03/06 Javascript
详解Axios统一错误处理与后置
2018/09/26 Javascript
AngularJs返回前一页面时刷新一次前面页面的方法
2018/10/09 Javascript
小程序如何支持使用 async/await详解
2019/09/12 Javascript
[48:22]VGJ.S vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python求算数平方根和约数的方法汇总
2016/03/09 Python
Python字符串拼接的几种方法整理
2017/08/02 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
2017/09/11 Python
深入理解Python爬虫代理池服务
2018/02/28 Python
python3.7简单的爬虫实例详解
2019/07/08 Python
python实现简单俄罗斯方块
2020/03/13 Python
Appium+Python实现简单的自动化登录测试的实现
2021/01/26 Python
屈臣氏菲律宾官网:Watsons菲律宾
2020/06/30 全球购物
成龙洗发水广告词
2014/03/14 职场文书
应届毕业生求职信范文
2014/07/07 职场文书
关爱空巢老人感想
2015/08/11 职场文书
创业计划书之游泳馆
2019/09/16 职场文书
Python 键盘事件详解
2021/11/11 Python
豆瓣2021评分最高动画剧集-豆瓣评分最高的动画剧集2021
2022/03/18 日漫
零基础学java之循环语句的使用
2022/04/10 Java/Android