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 相关文章推荐
在表单提交前进行验证的几种方式整理
Jul 31 Javascript
jQuery的观察者模式详解
Dec 22 Javascript
jQuery实现精美的多级下拉菜单特效
Mar 14 Javascript
JavaScript中isPrototypeOf函数作用和使用实例
Jun 01 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
Aug 21 Javascript
javascript产生随机数方法汇总
Jan 25 Javascript
写给vue新手们的vue渲染页面教程
Sep 01 Javascript
jQuery实现鼠标点击处心形漂浮的炫酷效果示例
Apr 12 jQuery
JS原生带缩略图的图片切换效果
Oct 10 Javascript
浅谈Vue.js中如何实现自定义下拉菜单指令
Jan 06 Javascript
在vue项目中使用sass语法问题
Jul 18 Javascript
Vue + Element UI图片上传控件使用详解
Aug 20 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中实现记住密码下次自动登录的例子
2014/11/06 PHP
php简单实现文件或图片强制下载的方法
2016/12/06 PHP
10个实用的脚本代码工具
2010/05/04 Javascript
javascript高级学习笔记整理
2011/08/14 Javascript
如何将JS的变量值传递给ASP变量
2012/12/10 Javascript
网页中返回顶部代码(多种方法)另附注释说明
2013/04/24 Javascript
js时间戳格式化成日期格式的多种方法
2013/11/11 Javascript
JavaScript中的关联数组问题
2015/03/04 Javascript
JavaScript数组去重的五种方法
2015/11/05 Javascript
JavaScript知识点整理
2015/12/09 Javascript
vue.js 表格分页ajax 异步加载数据
2016/10/18 Javascript
jQuery实现获取h1-h6标题元素值的方法
2017/03/06 Javascript
vue使用Axios做ajax请求详解
2017/06/07 Javascript
谈谈vue中mixin的一点理解
2017/12/12 Javascript
10个经典的网页鼠标特效代码
2018/01/09 Javascript
基于Vue实现的多条件筛选功能的详解(类似京东和淘宝功能)
2019/05/07 Javascript
Layui多选只有最后一个值的解决方法
2019/09/02 Javascript
python中正则表达式的使用详解
2014/10/17 Python
Python爬取网页中的图片(搜狗图片)详解
2017/03/23 Python
python实现对输入的密文加密
2019/03/20 Python
通过celery异步处理一个查询任务的完整代码
2019/11/19 Python
使用python的turtle绘画滑稽脸实例
2019/11/21 Python
Python+Selenium实现自动化的环境搭建的步骤(图文)
2020/09/01 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
2020/10/22 Python
HTML5 贪吃蛇游戏实现思路及源代码
2013/09/03 HTML / CSS
精致的手工皮鞋:Shoe Embassy
2019/11/08 全球购物
美国折扣地毯销售网站:Rugs.com
2020/03/27 全球购物
中科软笔试题和面试题
2014/10/07 面试题
新闻发布会主持词
2014/03/28 职场文书
2014幼儿园教师师德师风演讲稿
2014/09/10 职场文书
教师自我剖析材料
2014/09/29 职场文书
监考失职检讨书
2015/01/26 职场文书
实习证明模板
2015/06/16 职场文书
《水浒传》读后感3篇(范文)
2019/09/19 职场文书
pandas数值排序的实现实例
2021/07/25 Python
动作冒险《Hell Is Us》将采用虚幻5 消灭怪物探索王国
2022/04/13 其他游戏