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 相关文章推荐
20款效果非常棒的 jQuery 插件小结分享
Nov 18 Javascript
javascript延时加载之defer测试
Dec 28 Javascript
分析Node.js connect ECONNREFUSED错误
Apr 09 Javascript
js将当前时间格式转换成时间搓(自写)
Sep 26 Javascript
JavaScript中for..in循环陷阱介绍
Nov 12 Javascript
javascript中innerText和innerHTML属性用法实例分析
May 13 Javascript
jQuery实现鼠标点击弹出渐变层的方法
Jul 09 Javascript
基于jquery实现图片上传本地预览功能
Jan 08 Javascript
详解使用nvm安装node.js
Jul 18 Javascript
vue实现可视化可拖放的自定义表单的示例代码
Mar 20 Javascript
js实现删除li标签一行内容
Apr 16 Javascript
JS实现的tab切换并显示相应内容模块功能示例
Aug 03 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中关于抽象(abstract)类和抽象方法的问题分析
2014/01/03 PHP
PHP下获取上个月、下个月、本月的日期(strtotime,date)
2014/02/02 PHP
两种php给图片加水印的实现代码
2020/04/18 PHP
php查看一个变量的占用内存的实例代码
2020/03/29 PHP
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
判断客户端浏览器是否安装了Flash插件的多种方法
2010/08/11 Javascript
js动态设置鼠标事件示例代码
2013/10/30 Javascript
深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解
2015/03/05 Javascript
jQuery带时间的日期控件代码分享
2015/08/26 Javascript
js实现向右横向滑出的二级菜单效果
2015/08/27 Javascript
JavaScript实现页面跳转的几种常用方式
2015/11/28 Javascript
JavaScript轮播图简单制作方法
2017/02/20 Javascript
vue2.0中click点击当前li实现动态切换class
2017/06/21 Javascript
JavaScript在控件上添加倒计时功能的实现代码
2017/07/04 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
2017/07/13 Javascript
利用js给datalist或select动态添加option选项的方法
2018/01/25 Javascript
vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
2018/08/24 Javascript
JS 数组随机洗牌的实例代码
2018/09/12 Javascript
JS实现关闭小广告特效
2021/01/29 Javascript
jquery实现垂直手风琴菜单
2020/03/04 jQuery
wxPython窗口的继承机制实例分析
2014/09/28 Python
python实现基本进制转换的方法
2015/07/11 Python
详解Python中的文件操作
2016/08/28 Python
Python Web编程之WSGI协议简介
2018/07/18 Python
基于Python共轭梯度法与最速下降法之间的对比
2020/04/02 Python
如何让python的运行速度得到提升
2020/07/08 Python
python和go语言的区别是什么
2020/07/20 Python
python 使用建议与技巧分享(四)
2020/08/18 Python
美国肌肉和力量商店:Muscle & Strength
2019/06/22 全球购物
大二学生学习个人自我评价
2014/01/19 职场文书
红旗方阵解说词
2014/02/12 职场文书
马智宇结婚主持词
2014/04/01 职场文书
新郎新娘答谢词
2015/01/04 职场文书
2015年幼儿园保育员工作总结
2015/04/23 职场文书
MySQL下使用Inplace和Online方式创建索引的教程
2021/05/26 MySQL
通过feDisplacementMap和feImage实现水波特效
2022/04/24 HTML / CSS