js 实现数组查找二分法

二分法实现原理:二分查找可以解决已经排好序数组的查找问题:只要数组中包含target(即要查找的值),那么通过不断缩小包含target数组的范围,最终就可以找到它。

其算法流程如下:

开始,范围覆盖整个数组。

将数组的中间项与target进行比较,如果target比数组的中间项要小,则到数组的前半部分继续查找,反之,则到数组的后半部分继续查找。

如此,每次查找可以排除一半元素,范围缩小一半。就这样反复比较,反复缩小范围,最终就会在数组中找到target,或者确定原以为target所在的范围实际为空。

对于包含N个元素的表,整个查找过程大约要经过log(2)N次比较。

递归实现

例1:用递归二分法实现array.indexOf 功能(数组为正序排列)

function indexOf(arr,target,start,end){
start = start || 0;
end = end || arr.length - 1;
if(start > end){
return -1;
}
let mid = Math.floor((start + end)/2);
if(arr[mid] > target) {
end = mid-1;
return indexOf(arr,target,start,end);
}
else if(arr[mid] < target){
start = mid + 1;
return indexOf(arr,target,start,end);
}
else {
return mid;
}
}
let a = [0,1,2,3,4,5,6,434,435];
console.log(indexOf(a,12)); //打印结果为-1

while循环实现

function indexOf(arr,target,start,end){
start = start || 0;
end = end || arr.length - 1;
let mid = Math.floor((start + end)/2);
console.log(start,end);
while(start <= end){
console.log(start,end,target,arr[mid]);
if(target > arr[mid]){
start = mid + 1;
mid = Math.floor((start + end)/2);
}
else if(target < arr[mid]){
end = mid - 1;
mid = Math.floor((start + end)/2);
}
else {
return mid ;
}
}
console.log(start,end);
return -1;
}
let a = [0,1,2,3,4,5,6,434,435];
console.log(indexOf(a,5)); //打印结果为5

javascript实现二分法的更多相关文章

  1. JavaScript用二分法查找数据等

    //二分法查数据 var arr=[41,43,45,53,44,95,23]; var b=44; var min=0; var max=arr.length; for(var i=1;i<a ...

  2. javascript数组去重 String字符串去掉两端空格 javascript Array二分法排序 比较 javascript 求和

    通过原形添加方法: ==================数组去重(对象去重法)======================= Array.prototype.unique=function(){ va ...

  3. JavaScript之二分法

    二分法:   二分查找,又称为折半查找.   注意:二分法查找的数组必须是有序的. /* 获取元素88在数组中第一次出现的索引位置 如果数组元素中存在88,则直接返回88在数组中的索引位置即可. 如果 ...

  4. Web前端面试题目汇总

    以下是收集一些面试中经常会遇到的经典面试题以及自己面试过程中有一些未解决的问题,通过对知识的整理以及经验的总结,重新巩固自身的前端基础知识,如有错误或更好的答案,欢迎指正,水平有限,望各位不吝指教.: ...

  5. Web前端汇总

    http://www.cnblogs.com/bigboyLin/p/5272902.html HTML/CSS部分   1.什么是盒子模型? 在网页中,一个元素占有空间的大小由几个部分构成,其中包括 ...

  6. 【python】Leetcode每日一题-寻找旋转排序数组中的最小元素

    [python]Leetcode每日一题-寻找旋转排序数组中的最小元素 [题目描述] 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组nums ...

  7. JavaScript中的二分法插入算法

    算法主体部分 var OnlineUser = { //list : 待查找的数组 //key : 待插入的值 //order : 数组的顺序 1:从小到大 0:从大到小 //start : 开始查找 ...

  8. 9月19日下午JavaScript数组冒泡排列和二分法

    数组 一.冒泡排列 对数组attr = [1,8,6,4,5,3,7,2,9]进行由大到小排列,用冒泡排列的方法排列时,会对数组进行比较互换.如果前一个数字较大,这2个元素排列方式不变,如果后一个元素 ...

  9. JavaScript数字例子,二分法,冒泡排序

    先看一下两个例子: 十个成绩,求总分,最高分,最低分 //输入10个成绩,求总分,最高,最低 var arr=new Array(67,45,56,12,90,98,23,43,56,99,97); ...

随机推荐

  1. jstl标准标签库 其他标签

    url操作标签 import 将另一个页面的内容引入到这个页面上来, 与include指令的区别: 这个标签可以引入其他项目中甚至网络上的资源 <c:import url="被导入的路 ...

  2. 735. Asteroid Collision彗星相撞后的消失数组

    [抄题]: We are given an array asteroids of integers representing asteroids in a row. For each asteroid ...

  3. hdpi对应分辨率

    ldpi  QVGA (240×320) mdpi  HVGA (320×480) hdpi  WVGA (480×800),FWVGA (480×854) xhdpi  720P(1280*720) ...

  4. SQL Server 2008 R2 链接 Oracle

    参考网站: SP_addlinkedserver 小结 (oracle,sql server,access,excel) 64位SqlServer通过链接服务器与32位oracle通讯 SQL Ser ...

  5. Android无线蓝牙总结

    一.基础知识: ①蓝牙的四层协议: 蓝牙协议分为4层,即核心协议层.电缆替代协议层.电话控制协议层和采纳的其它协议层.这4种协议中最重要的是核心协议.蓝牙的核心协议包括基带.链路管理.逻辑链路控制和适 ...

  6. 相对于父元素的fixed定位的实现

    问题描述 之前在项目中,遇到了一个场景,需要实现相对于父元素的fixed定位:在父元素内拖动滚动条时,"fixed"定位的元素不能滑动,在外层拖动滚动条时,父元素及父元素内的所有元 ...

  7. 关于CSS布局

    是时候单独列出一篇文章记录CSS布局了. http://www.imooc.com/article/2235  [史上最全Html和CSS布局技巧]

  8. 过滤器和拦截器filter和Interceptor的区别

    1.创建一个Filter过滤器只需两个步骤 创建Filter处理类 web.xml文件中配置Filter 2.Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的 ...

  9. Rabbit mq 简单应用

    参考:http://rabbitmq.mr-ping.com/AMQP/AMQP_0-9-1_Model_Explained.html 简答模式(exchange不工作) import pika # ...

  10. 跨域ajax问题

    1. Intro 在用ajax请求时,请求的域名和所在域名不同,会出现跨域问题导致请求失败. 复杂请求: 条件: .请求方式:HEAD.GET.POST .请求头信息: Accept Accept-L ...