基于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 相关文章推荐
passwordStrength 基于jquery的密码强度检测代码使用介绍
Oct 08 Javascript
使用JQuery和CSS模拟超链接的用户单击事件的实现代码
May 23 Javascript
详解JavaScript函数绑定
Aug 18 Javascript
ExtJS中设置下拉列表框不可编辑的方法
May 07 Javascript
javascript实现起伏的水波背景效果
May 16 Javascript
Bootstrap表单Form全面解析
Jun 13 Javascript
Web打印解决方案之普通报表打印功能
Aug 29 Javascript
Javascrip实现文字跳动特效
Nov 27 Javascript
利用jQuery+localStorage实现一个简易的计时器示例代码
Dec 25 jQuery
Vue.js 2.0和Cordova开发webApp环境搭建方法
Feb 26 Javascript
vue实现Input输入框模糊查询方法
Jan 29 Javascript
如何利用js在两个html窗口间通信
Apr 27 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数组函数序列之array_key_exists() - 查找数组键名是否存在
2011/10/29 PHP
php文档工具PHP Documentor安装与使用方法
2016/01/25 PHP
PHP基于timestamp和nonce实现的防止重放攻击方案分析
2019/07/26 PHP
PHP 使用位运算实现四则运算的代码
2021/03/09 PHP
jQuery 隔行换色 支持键盘上下键,按Enter选定值
2009/08/02 Javascript
javascript之典型高阶函数应用介绍二
2013/01/10 Javascript
JS中不为人知的五种声明Number的方式简要概述
2013/02/22 Javascript
innerText和textContent对比及使用介绍
2013/02/27 Javascript
文字不间断滚动(上下左右)实例代码
2013/04/21 Javascript
javascript 按键事件(兼容各浏览器)
2013/12/20 Javascript
通过JQuery将DIV的滚动条滚动到指定的位置方便自动定位
2014/05/05 Javascript
js监听鼠标事件控制textarea输入字符串的个数
2014/09/29 Javascript
jQuery实现指定区域外单击关闭指定层的方法【经典】
2016/06/22 Javascript
前端微信支付js代码
2016/07/25 Javascript
Vue声明式渲染详解
2017/05/17 Javascript
Vue-Quill-Editor富文本编辑器的使用教程
2018/09/21 Javascript
AngularJS $http post 传递参数数据的方法
2018/10/09 Javascript
利用Bootstrap Multiselect实现下拉框多选功能
2019/04/08 Javascript
React精髓!一篇全概括小结(急速)
2019/05/23 Javascript
详解webpack引用jquery(第三方模块)的三种办法
2019/08/21 jQuery
node.js +mongdb实现登录功能
2020/06/18 Javascript
Python卸载模块的方法汇总
2016/06/07 Python
pip安装python库的方法总结
2019/08/02 Python
TensorFlow基于MNIST数据集实现车牌识别(初步演示版)
2019/08/05 Python
使用python实现回文数的四种方法小结
2019/11/24 Python
Python3内置函数chr和ord实现进制转换
2020/06/05 Python
Python读取二进制文件代码方法解析
2020/06/22 Python
如何在Win10系统使用Python3连接Hive
2020/10/15 Python
英国最大的奢侈品零售网络商城:Flannels
2016/09/16 全球购物
捷克鲜花配送:Florea.cz
2018/10/29 全球购物
维多利亚的秘密阿联酋官网:Victoria’s Secret阿联酋
2019/12/07 全球购物
2015年幼儿园元旦游艺活动策划书
2014/12/09 职场文书
中学生社区服务活动报告
2015/02/05 职场文书
4S店收银员岗位职责
2015/04/07 职场文书
小学四年级班务总结该怎么写?
2019/08/16 职场文书
PyTorch 实现L2正则化以及Dropout的操作
2021/05/27 Python