2分查找

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
</body>
<script>
  const arr = [3, 5, 19, 22, 25, 33, 45, 47, 57, 66, 71, 78];
  console.log(init(arr, 88))
  console.log(init(arr, 66))
  console.log(init(arr, 22))
  function init(A, x) {
    let l = 0;
    let r = A.length - 1;
    let guess;
    while (l < r) {
      guess = Math.floor((l + r) / 2);
      if (A[guess] === x)
        return guess
      else if (A[guess] > x) {
        r = guess - 1
      } else {
        l = guess + 1
      }
    }
    return -1
  }
</script>

</html>

1. 我们先声明最左边为 0 ,最右边为传入数组的长度 ,

guess 表示为中间值
 let l = 0;
    let r = A.length - 1;
    let guess;

2. 做一个判断 当左边右边的时候 程序运行 反之 返回 -1 

  while (l < r) {
    }
    return -1

3. 做判断 

(1) 当   A[guess] 这个中间值刚好等于 我们要查找的值时   返回 guess 

 (2) 当  A[guess]  大于查找的值 时 ,

设置最右边 r 为  r =   guess - 1 

 比如    A[0]  到   A[guess - 1 ] 这期间的所有值

 (3) 当  A[guess]  小于查找的值 时 ,

设置最左边  l 为     l = guess + 1

 比如    A[guess +1 ]  到   A [length-1 ] 这期间的所有值

 guess = Math.floor((l + r) / 2);
      if (A[guess] === x)
        return guess
      else if (A[guess] > x) {
        r = guess - 1
      } else {
        l = guess + 1
      }

 

posted @ 2020-03-03 22:51  1点  阅读(174)  评论(0编辑  收藏  举报