基于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 相关文章推荐
JavaScript 打地鼠游戏代码说明
Oct 12 Javascript
HTML Color Picker(js拾色器效果)
Aug 27 Javascript
js/jQuery简单实现选项卡功能
Jan 02 Javascript
javascript数组去重方法汇总
Apr 23 Javascript
jQuery通过deferred对象管理ajax异步
May 20 Javascript
jQuery轮播图效果精简版完整示例
Sep 04 Javascript
jQuery完成表单验证的实例代码(纯代码)
Sep 30 jQuery
javascript数组拍平方法总结
Jan 20 Javascript
原生JS+HTML5实现跟随鼠标一起流动的粒子动画效果
May 03 Javascript
用react-redux实现react组件之间数据共享的方法
Jun 08 Javascript
微信小程序自定义轮播图
Nov 04 Javascript
JavaScript实现拖拽功能
Feb 11 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
最省空间的计数器
2006/10/09 PHP
自动生成文章摘要的代码[PHP 版本]
2007/03/20 PHP
PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子
2014/05/10 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(六)
2014/06/23 PHP
php通过sort()函数给数组排序的方法
2015/03/18 PHP
php 判断过去离现在几年的函数(实例代码)
2016/11/15 PHP
JS判断对象是否存在的10种方法总结
2013/12/23 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 图片库
2015/01/09 Javascript
JavaScript中匿名函数的用法及优缺点详解
2016/06/01 Javascript
基于d3.js实现实时刷新的折线图
2016/08/03 Javascript
js实现textarea限制输入字数
2017/02/13 Javascript
Vue实现购物车场景下的应用
2017/11/27 Javascript
浅谈用Webpack路径压缩图片上传尺寸获取的问题
2018/02/22 Javascript
解决VUE框架 导致绑定事件的阻止冒泡失效问题
2018/02/24 Javascript
webpack4 处理SCSS的方法示例
2018/09/03 Javascript
新手快速入门微信小程序组件库 iView Weapp
2019/06/24 Javascript
[03:10]2014DOTA2 TI马来劲旅Titan首战告捷目标只是8强
2014/07/10 DOTA
python实现批量改文件名称的方法
2015/05/25 Python
python Tkinter版学生管理系统
2019/02/20 Python
django用户登录验证的完整示例代码
2019/07/21 Python
Pytorch Tensor的索引与切片例子
2019/08/18 Python
使用Python绘制台风轨迹图的示例代码
2020/09/21 Python
美国厨房和园艺工具网上商店:Nestneed
2019/08/24 全球购物
英国领先的维生素和补充剂品牌:Higher Nature
2019/08/26 全球购物
广州一家公司的.NET面试题
2016/06/11 面试题
Servlet都有哪些方法?主要作用是什么?
2014/03/04 面试题
大学毕业生通用自荐信范文
2013/10/31 职场文书
《开国大典》教学反思
2014/04/19 职场文书
学校法制宣传日活动总结
2014/11/01 职场文书
大学生村官工作总结2015
2015/04/09 职场文书
2015年公路养护工作总结
2015/05/13 职场文书
自信主题班会
2015/08/14 职场文书
党员干部学法用法心得体会
2016/01/21 职场文书
JavaScript 对象创建的3种方法
2021/11/17 Javascript
Mysql 8.x 创建用户以及授予权限的操作记录
2022/04/18 MySQL
MySQL数据库 安全管理
2022/05/06 MySQL