基于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 中创建自定义对象的方法汇总
Dec 04 Javascript
使用javascript提交form表单方法汇总
Jun 25 Javascript
javascript实现控制的多级下拉菜单
Jul 05 Javascript
纯javascript响应式树形菜单效果
Nov 10 Javascript
全面解析jQuery $(document).ready()和JavaScript onload事件
Jun 08 Javascript
深入理解JS DOM事件机制
Aug 06 Javascript
async/await优雅的错误处理方法总结
Jan 30 Javascript
vue watch关于对象内的属性监听
Apr 22 Javascript
微信小程序实现购物车代码实例详解
Aug 29 Javascript
过滤器vue.filters的使用方法实现
Sep 18 Javascript
Vue插件之滑动验证码用法详解
Apr 05 Javascript
JavaScript文档加载模式以及元素获取
Jul 28 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
异世界新番又来了,同样是从零开始,男主的年龄降到5岁
2020/04/09 日漫
php学习 字符串课件
2008/06/15 PHP
PHP源码之explode使用说明
2011/08/05 PHP
使用array mutisort 实现按某字段对数据排序
2013/06/18 PHP
探讨Smarty中如何获取数组的长度以及smarty调用php函数的详解
2013/06/20 PHP
JavaScript 学习笔记一些小技巧
2010/03/28 Javascript
浅析document.createDocumentFragment()与js效率
2013/07/08 Javascript
javascript对象的使用和属性操作示例详解
2014/03/02 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
2015/02/28 Javascript
javascript实现随时变化着的背景颜色
2015/04/02 Javascript
倾力总结40条常见的移动端Web页面问题解决方案
2016/05/24 Javascript
jQuery插件扩展测试实例
2016/06/21 Javascript
node.js文件上传处理示例
2016/10/27 Javascript
学习 NodeJS 第八天:Socket 通讯实例
2016/12/21 NodeJs
Vue.js简易安装和快速入门(第二课)
2017/10/17 Javascript
JavaScript 中使用 Generator的方法
2017/12/29 Javascript
VUE 使用中踩过的坑
2018/02/08 Javascript
vue实现直播间点赞飘心效果的示例代码
2019/09/20 Javascript
Python 26进制计算实现方法
2015/05/28 Python
使用url_helper简化Python中Django框架的url配置教程
2015/05/30 Python
Python基于identicon库创建类似Github上用的头像功能
2017/09/25 Python
详解如何使用Python编写vim插件
2017/11/28 Python
python2和python3的输入和输出区别介绍
2018/11/20 Python
pygame游戏之旅 添加碰撞效果的方法
2018/11/20 Python
对Python中DataFrame选择某列值为XX的行实例详解
2019/01/29 Python
对Django url的几种使用方式详解
2019/08/06 Python
html5 学习简单的拾色器
2010/09/03 HTML / CSS
如何进行Linux分区优化
2016/09/13 面试题
物流专业毕业生推荐信范文
2013/11/18 职场文书
客户表扬信范文
2014/01/10 职场文书
人事行政经理岗位职责
2014/06/18 职场文书
少先大队干部竞选稿
2015/11/20 职场文书
学会掌握自己命运的十条黄金法则:
2019/08/08 职场文书
python munch库的使用解析
2021/05/25 Python
mybatis中注解与xml配置的对应关系和对比分析
2021/08/04 Java/Android
JavaScript设计模式之原型模式详情
2022/06/21 Javascript