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获取IUSR_机器名和IWAM_机器名帐号的密码
Dec 06 Javascript
DWZ table的原生分页浅谈
Mar 01 Javascript
jQuery中even选择器的定义和用法
Dec 23 Javascript
javascript实现的简单计时器
Jul 19 Javascript
JavaScript自学笔记(必看篇)
Jun 23 Javascript
vue2.0 自定义日期时间过滤器
Jun 07 Javascript
jquery中有哪些api jQuery主要API
Nov 20 jQuery
深入理解Node module模块
Mar 26 Javascript
10行代码实现微信小程序滑动tab切换
Dec 28 Javascript
Javascript call及apply应用场景及实例
Aug 26 Javascript
JavaScript 实现页面滚动动画
Apr 24 Javascript
Ajax实现异步加载数据
Nov 17 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正确配置mysql(apache环境)
2011/08/28 PHP
一个简洁的PHP可逆加密函数(分享)
2013/06/06 PHP
PHP中模糊查询并关联三个select框
2017/06/19 PHP
PHP封装的mysqli数据库操作类示例
2019/02/16 PHP
extjs 学习笔记 四 带分页的grid
2009/10/20 Javascript
js常用代码段整理
2011/11/30 Javascript
Node.js安装教程和NPM包管理器使用详解
2014/08/16 Javascript
使用JavaScript获取Request中参数的值方法
2016/09/27 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
2016/11/10 Javascript
Angular开发者指南之入门介绍
2017/03/05 Javascript
简单实现JS上传图片预览功能
2017/04/14 Javascript
Jquery获取radio选中的值
2017/05/05 jQuery
提升页面加载速度的插件InstantClick
2017/09/12 Javascript
echarts饼图扇区添加点击事件的实例
2017/10/16 Javascript
JavaScript数据结构与算法之队列原理与用法实例详解
2017/11/22 Javascript
微信小程序scroll-view实现滚动穿透和阻止滚动的方法
2018/08/20 Javascript
jquery实现垂直无限轮播的方法分析
2019/07/16 jQuery
VUE注册全局组件和局部组件过程解析
2019/10/10 Javascript
绘制微信小程序验证码功能的实例代码
2021/01/05 Javascript
[42:20]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
[54:18]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第一场 1月22日
2021/03/11 DOTA
Python迭代器和生成器介绍
2015/03/06 Python
Python使用paramiko操作linux的方法讲解
2019/02/25 Python
Python-while 计算100以内奇数和的方法
2019/06/11 Python
python如何从键盘获取输入实例
2020/06/18 Python
html5理解head_动力节点Java学院整理
2017/07/13 HTML / CSS
澳洲的服装老品牌:SABA
2018/02/06 全球购物
Homestay中文官网:全球寄宿家庭
2018/10/18 全球购物
万代美国官网:PREMIUM BANDAI USA
2020/09/11 全球购物
25道Java面试题集合
2013/05/21 面试题
实验教师岗位职责
2014/02/13 职场文书
现金出纳岗位职责
2014/03/15 职场文书
三八节主持词
2014/03/17 职场文书
销售经理岗位职责范本
2015/04/02 职场文书
草房子读书笔记
2015/06/29 职场文书
《西门豹》教学反思
2016/02/23 职场文书