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 相关文章推荐
JS实现打开本地文件或文件夹
Mar 09 Javascript
小议javascript 设计模式 推荐
Oct 28 Javascript
JavaScript中的原型和继承详解(图文)
Jul 18 Javascript
JQuery实现鼠标滚轮滑动到页面节点
Jul 28 Javascript
JavaScript职责链模式概述
Sep 17 Javascript
微信小程序 安全包括(框架、功能模块、账户使用)详解
Jan 16 Javascript
微信小程序 扎金花简单实例
Feb 21 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
Dec 07 Javascript
AngularJS实现的生成随机数与猜数字大小功能示例
Dec 25 Javascript
vue判断input输入内容全是空格的方法
Mar 02 Javascript
vue中导出Excel表格的实现代码
Oct 18 Javascript
茶余饭后聊聊Vue3.0响应式数据那些事儿
Oct 30 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
手冲咖啡应该是现代精品咖啡店的必备选项吗?
2021/03/03 冲泡冲煮
利用js调用后台php进行数据处理原码
2006/10/09 PHP
php实现数组筛选奇数和偶数示例
2014/04/11 PHP
thinkphp3.2嵌入百度编辑器ueditor的实例代码
2017/07/13 PHP
javascript flash下fromCharCode和charCodeAt方法使用说明
2008/01/12 Javascript
原创javascript小游戏实现代码
2010/08/19 Javascript
JavaScript基本数据类型及值类型和引用类型
2015/08/25 Javascript
jquery实现可自动收缩的TAB网页选项卡代码
2015/09/06 Javascript
Three.js利用dat.GUI如何简化试验流程详解
2017/09/26 Javascript
bootstrap时间插件daterangepicker使用详解
2017/10/19 Javascript
JavaScript中 ES6变量的结构赋值
2018/07/10 Javascript
小程序如何在不同设备上自适应生成海报的实现方法
2019/08/20 Javascript
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
node.js 基于 STMP 协议和 EWS 协议发送邮件
2021/02/14 Javascript
Python运算符重载用法实例分析
2015/06/01 Python
python Django模板的使用方法
2016/01/14 Python
用Python解决计数原理问题的方法
2016/08/04 Python
win与linux系统中python requests 安装
2016/12/04 Python
Python 数据结构之队列的实现
2017/01/22 Python
python射线法判断一个点在图形区域内外
2019/06/28 Python
Django logging配置及使用详解
2019/07/23 Python
Python for循环与getitem的关系详解
2020/01/02 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
python实现拼图小游戏
2020/02/22 Python
Django框架安装及项目创建过程解析
2020/09/14 Python
html5 Web SQL Database 之事务处理函数transaction与executeSQL解析
2013/11/07 HTML / CSS
施华洛世奇水晶荷兰官方网站:SWAROVSKI荷兰
2017/05/12 全球购物
美国眼镜网站:LensCrafters
2020/01/19 全球购物
找工作最新求职信
2013/12/22 职场文书
2015年学校精神文明工作总结
2015/05/27 职场文书
2015新员工工作总结范文
2015/10/15 职场文书
2016年清明节寄语
2015/12/04 职场文书
Python基础之pandas数据合并
2021/04/27 Python
mysql脏页是什么
2021/07/26 MySQL
SQL实现LeetCode(180.连续的数字)
2021/08/04 MySQL
一小时学会TensorFlow2之基本操作2实例代码
2021/09/04 Python