美文网首页
用javascript实现二分查找

用javascript实现二分查找

作者: 王伯卿 | 来源:发表于2018-02-19 22:39 被阅读0次

二分查找又称折半查找,顾名思义就是一半半的查找。另外二分查找的列表需要为有序列表。

思路:
1)定义左边界下标,右边界下标,中间数字下标
2)当左边界下标不大于右边界下标时(这个等价于“小于等于”,有点拗口)
2-1 如果查找到的数比目标数要大则以此中间数字下标-1为右边界,跳到2)
2-2 如果查找到的数比目标数要小则以此中间数字下标+1为左边界,跳到2)
2-3 如果找到目标数字,直接返回,结束
3)返回-1,表示无法查找到

然后是代码:

var binarySearch=function(arr,key){

  // 定义左边界下标,右边界下标,中间数字下标
  var left=0;
  var right=arr.length-1;
  var mid;

  while(left<=right){
    mid=parseInt((left+right)/2);

    if(arr[mid]>key){
      // 如果查找到的数比目标数要大,则以此中间数字下标-1为右边界
      right=mid-1;
    }else if(arr[mid]<key){
      // 如果查找到的数比目标数要小,则以此中间数字下标+1为左边界
      left=mid+1;
    }else{
      // 如果找到目标数字,直接返回,结束
      return mid;
    }
  }

如果是C语言,left和high在很大的时候可能会发生溢出的情况(mid为负数)。但是javascript似乎没有这个问题,因此这里不讨论。

然后是测试用例,我们就用一个循环来判断每次查找是否正确。
假设数组为1 2 3 4 5 6 7 8 9 10 11
那么:
查找1,输出1
查找2,输出2
……
查找11,输出11
查找12,输出undefined

var testArr=[1,2,3,4,5,6,7,8,9,10,11];
var result;
for(var i=0;i<testArr.length;i++){
  result=binarySearch(testArr,testArr[i]);
  console.log(testArr[result]);
}
result=binarySearch(testArr,12);
console.log(testArr[result]);

结果

1
2
3
4
5
6
7
8
9
10
11
undefined

测试通过。应该没有问题。

然后是最差情况下的时间复杂度的问题。
假设现在数据规模为N
第一次折半后数据规模为N/2^1
第二次折半后数据规模为N/2^2
第三次折半后数据规模为N/2^3
第M此折半后数据规模为N/2^M,而此时,数据规模为1,假设查找不到,跳出
因此最差的情况下,查找了M+1次
N/2^M=1则M=lg(N)
所以O(n)=M+1=lg(N)+1=lg(N)
log以2为底。

相关文章

  • 用javascript实现二分查找

    二分查找又称折半查找,顾名思义就是一半半的查找。另外二分查找的列表需要为有序列表。 思路:1)定义左边界下标,右边...

  • 算法之二分查找

    二分查找 二分查找是著名、高效并有应用广泛的查找算法。 二分常规实现 1.循环实现 下面我用python语言实现循...

  • 刷前端面经笔记(九)

    1.JavaScript实现二分法查找? 二分法查找,也称折半查找,是一种在有序数组中查找特定元素的搜索算法。查找...

  • JS实现插入排序、快排、二分查找法

    用JS实现插入排序 用JS实现快排 用JS实现二分查找法

  • 简单算法

    冒泡排序: while 实现的二分查找: 递归实现二分查找:

  • JavaScript实现二分查找

    最近撸《算法》第四版,开篇就是一个Java版本的二分查找算法,下面以JS实现一下。 二分查找的前提为:数组、有序。...

  • Java数据结构和算法(有序数组和二分查找)

    一、概述 有序数组中常常用到二分查找,能提高查找的速度。今天,我们用顺序查找和二分查找实现数组的增删改查。 二、有...

  • 分治算法(swift二分法排序递归实现)

    二分查找 1、二分查找(Binary Search) 2、二分查找的基本思想 swift算法实现

  • 二分查找

    网上找到的图片便于理解 二分查找递归实现与循环实现代码: /** 二分查找 1.二分查找又称折半查找,它是一种效率...

  • 二分查找

    数据顺序存储,有序序列 O(logn) 递归实现二分查找: 非递归实现二分查找:

网友评论

      本文标题:用javascript实现二分查找

      本文链接:https://www.haomeiwen.com/subject/psswtftx.html