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 AOP 实现ajax回调函数使用比较方便
Nov 20 Javascript
Javascript中定义方法的另类写法(批量定义js对象的方法)
Feb 25 Javascript
jQuery.Callbacks()回调函数队列用法详解
Jun 14 Javascript
原生JavaScript制作计算器
Oct 16 Javascript
DWR3 访问WEB元素的两种方法实例详解
Jan 03 Javascript
javascript获取以及设置光标位置
Feb 16 Javascript
vue使用stompjs实现mqtt消息推送通知
Jun 22 Javascript
AngularJs 禁止模板缓存的方法
Nov 28 Javascript
Vue项目查看当前使用的elementUI版本的方法
Sep 27 Javascript
vue 2.5.1 源码学习 之Vue.extend 和 data的合并策略
Jun 04 Javascript
js事件触发操作实例分析
Jun 21 Javascript
LayUI动态设置checkbox不显示的解决方法
Sep 02 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
默默简单的写了一个模板引擎
2007/01/02 PHP
第4章 数据处理-php正则表达式-郑阿奇(续)
2011/07/04 PHP
列举PHP的Yii 2框架的开发优势
2015/07/03 PHP
thinkPHP引入类的方法详解
2016/12/08 PHP
PHP判断密码强度的方法详解
2017/05/26 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
PHP Trait功能与用法实例分析
2020/06/03 PHP
jQuery ReferenceError: $ is not defined 错误的处理办法
2013/05/10 Javascript
JS验证控制输入中英文字节长度(input、textarea等)具体实例
2013/06/21 Javascript
完美实现仿QQ空间评论回复特效
2015/05/06 Javascript
实例详解angularjs和ajax的结合使用
2015/10/22 Javascript
js闭包引起的事件注册问题介绍
2016/03/29 Javascript
DWR中各种java方法的调用
2016/05/04 Javascript
Vuejs 用$emit与$on来进行兄弟组件之间的数据传输通信
2017/02/23 Javascript
JavaScript实现三级联动菜单效果
2017/08/16 Javascript
基于js中style.width与offsetWidth的区别(详解)
2017/11/12 Javascript
js实现网页同时进行多个倒计时功能
2019/02/25 Javascript
Javascript var变量删除原理及实现
2020/08/26 Javascript
[12:29]《一刀刀一天》之DOTA全时刻19:蝙蝠骑士田伯光再度不举
2014/06/10 DOTA
Python中的下划线详解
2015/06/24 Python
尝试使用Python多线程抓取代理服务器IP地址的示例
2015/11/09 Python
Python实现基于二叉树存储结构的堆排序算法示例
2017/12/08 Python
Python使用SQLite和Excel操作进行数据分析
2018/01/20 Python
Python3.6使用tesseract-ocr的正确方法
2018/10/17 Python
Flask框架单例模式实现方法详解
2019/07/31 Python
pytorch动态网络以及权重共享实例
2020/01/06 Python
Python中关于logging模块的学习笔记
2020/06/03 Python
使用python实现下载我们想听的歌曲,速度超快
2020/07/09 Python
芬兰设计商店美国:Finnish Design Shop US
2019/03/25 全球购物
澳大利亚领先的男装零售连锁店:Lowes
2020/08/07 全球购物
remote接口和home接口主要作用
2013/05/15 面试题
工厂厂长的职责
2013/12/12 职场文书
个人自我评价分享
2013/12/20 职场文书
学校实习推荐信
2015/03/27 职场文书
Nginx反向代理、重定向
2022/04/13 Servers
Vue3实现简易音乐播放器组件
2022/08/14 Vue.js