JavaScript折半查找(二分查找)算法原理与实现方法示例


Posted in Javascript onAugust 06, 2018

本文实例讲述了JavaScript折半查找(二分查找)算法原理与实现方法。分享给大家供大家参考,具体如下:

一、问题描述:

在一个升序数组中,使用折半查找得到要查询的值的索引位置。如:

var a=[1,2,3,4,5,6,7,8,9];
search(a,3);//返回2
search(a,1);//左边界,返回0
search(a,9);//右边界,返回8
search(a,0);//比最小的值还小,返回"您查找的数值不存在"
search(a,10);//比最大的值还大,返回"您查找的数值不存在"

注:折半查找必须在有序数组中才有效,无序的数组不能实现查找功能。比如:在[10,5,6,7,8,9,20]中查找10,中间索引位置的值为7,比较得出7比10小,因而应该在右子数组中查找,实际上不可能找到10;

二、我的实现

function search(arr,num) {
  var l=arr.length;
  var left=0;
  var right=l-1;
  var center=Math.floor((left+right)/2);
  while(left<=l-1&&right>=0){
    if (arr[center]==num) return center;
    if (left==right) return "您查找的数不存在";
    if (arr[center]>num) {
      right=center-1;
      center=Math.floor((left+right)/2);
    }else if (arr[center]<num) {
      left=center+1;
      center=Math.floor((left+right)/2);
    }
  }
}
var a=[1,2,3,4,5,6,7,8,9];
console.log(search(a,-2));

说明:

1、基本思路:

每次比较,如果数组中间索引位置的值比要查找的值大,就转而在数组中间位置之前的子数组中查找;相反,如果数组中间索引位置的值比要查找的值大,就转而在数组中间位置之后的子数组中查找;如果数组中间索引位置的值恰好等于要查找的值,就返回该索引位置。

2、left定义查找范围的起始位置,right定义查找范围的结束位置,center定义查找范围的中间位置。

3、while中的逻辑说明:

(1)由于不知道具体查找查找多少次,while是比较好的选择;

(2)循环结束条件:

a、一旦当right小于0时,就不再查找,再纠缠也不会有结果。例如:在a=[1,2,3,4,5,6,7,8,9]中查找0,当查找范围变为left=0,right=0,center=0时,进入while语句,由于arr[center]>0,故执行

right=center-1;
center=Math.floor((left+right)/2);

得到right=-1此时应不再进入循环;

b、一旦当left>l-1时,就不再查找,同样再纠缠也不会有结果。例如:在a=[1,2,3,4,5,6,7,8,9]中查找10,当查找范围变为left=8,right=8,center=8时,进入while语句,由于arr[center]<10,故执行

left=center;
center=Math.floor((left+right)/2);

得到left=9,此时应不再进入循环;

4、始终是通过center匹配到要查找的值;

5、Math.floor处理了查找范围长度为偶数的情况;

6、当left==right了,而arr[center]==num却没执行,可以得出结论查找不到的;

7、当arr[center]==num时,整个函数都结束了,后面语句是不会执行的。

上述代码使用在线HTML/CSS/JavaScript代码运行工具http://tools.3water.com/code/HtmlJsRun测试运行结果如下:

JavaScript折半查找(二分查找)算法原理与实现方法示例

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript对talbe进行动态添加、删除、验证实现代码
Mar 29 Javascript
js函数的引用, 关于内存的开销
Sep 17 Javascript
javascript特殊用法示例介绍
Nov 29 Javascript
AngularJS使用ngOption实现下拉列表的实例代码
Jan 23 Javascript
JS实现的添加弹出层并完成锁屏操作示例
Apr 07 Javascript
JQuery实现图片轮播效果
May 08 jQuery
jQuery dateRangePicker插件使用方法详解
Jul 28 jQuery
JS中Swiper的使用和轮播图效果
Aug 11 Javascript
Javascript的this详解
Mar 23 Javascript
详解微信小程序开发(项目从零开始)
Jun 06 Javascript
基于Vue中使用节流Lodash throttle详解
Oct 30 Javascript
解决Vue项目中tff报错的问题
Oct 21 Javascript
JavaScript插入排序算法原理与实现方法示例
Aug 06 #Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
Aug 06 #Javascript
ES6 系列之 WeakMap的使用示例
Aug 06 #Javascript
JavaScript选择排序算法原理与实现方法示例
Aug 06 #Javascript
ES6 中可以提升幸福度的小功能
Aug 06 #Javascript
原生JS实现的轮播图功能详解
Aug 06 #Javascript
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
Aug 06 #Javascript
You might like
php a simple smtp class
2007/11/26 PHP
php浏览历史记录的方法
2015/03/10 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
js option删除代码集合
2008/11/12 Javascript
网页整体变灰白色(兼容各浏览器)实例
2013/04/21 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
JS实现图片无间断滚动代码汇总
2014/07/30 Javascript
JS获取各种宽度、高度的简单介绍
2014/12/19 Javascript
浅析JS异步加载进度条
2016/05/05 Javascript
使用Script元素发送JSONP请求的方法
2016/06/12 Javascript
js Canvas绘制圆形时钟效果
2017/02/17 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
2017/05/17 Javascript
详解vue2.0 使用动态组件实现 Tab 标签页切换效果(vue-cli)
2017/08/30 Javascript
Vue中的methods、watch、computed的区别
2018/11/26 Javascript
浅析JavaScript异步代码优化
2019/03/18 Javascript
vue 列表页跳转详情页获取id以及详情页通过id获取数据
2019/03/27 Javascript
使用 node.js 模仿 Apache 小部分功能
2019/07/07 Javascript
vue+element使用动态加载路由方式实现三级菜单页面显示的操作
2020/08/04 Javascript
axios封装与传参示例详解
2020/10/18 Javascript
浅谈scrapy 的基本命令介绍
2017/06/13 Python
Pycharm新建模板默认添加个人信息的实例
2019/07/15 Python
解析Python3中的Import
2019/10/13 Python
python3连接kafka模块pykafka生产者简单封装代码
2019/12/23 Python
python求解汉诺塔游戏
2020/07/09 Python
python中Pexpect的工作流程实例讲解
2021/03/02 Python
以特惠价提供在线奢侈品购物:FRMODA.com
2018/01/25 全球购物
什么是.net
2015/08/03 面试题
法律专业自我鉴定
2013/10/03 职场文书
银行学习十八大感想
2014/01/11 职场文书
汽车专业学生自我评价
2014/01/19 职场文书
外语系毕业生求职自荐信
2014/04/12 职场文书
2015年维修工作总结
2015/04/25 职场文书
高中历史教学反思
2016/02/19 职场文书
高中地理教学反思
2016/02/19 职场文书
七年级之开学家长寄语35句
2019/09/05 职场文书
python 详解turtle画爱心代码
2022/02/15 Python