三大算法(三)js实现二分查找

方式1: 递归方式实现:

// 演示数组的二分查找算法:
      // 前提:
      // 1, 索引数组;
      // 2, 数组是已经排好序的了(没排好则用冒泡排序或者选择排序排好)。
      var arr = [2, 5, 8]; // , 10, 15, 18, 22, 24, 24, 28, 33, 35, 50, 55, 56, 57, 60, 61, 62, 66, 70];
      var search = 3; // 具体分析, 可以将该数据修改为不同的值, 比如: 2, 5, 8,
      // 原理: 每次都找该数组的某一段的中间项, 并跟要找的目标进行"对比"
      // 1, 如果刚好相等, 则就算找出来了
      // 2, 如果中间项比目标大, 就只要去左边的那一半中找(不含中间项)
      // 3, 如果中间项比目标小, 就只要去右边的那一半中找(不含中间项)

      // 假设有这么一个函数, 它能够从某个数组arr中的某个下标范围(start---end)中找指定的数据value
      // 这里, 假设: start一定是不能大于$end, 否则, 我们就认为找不到了!

      // 使用递归方式
      function binary_search(arr, value, start, end) {
        if (start > end) {
          return false;
        }
        var mid = Math.floor((start + end) / 2); // 取得两个下标中的中间下标(一半位置) 数据个数为偶数时 出现.5情况时向下或向上取下整数
        var mid_value = arr[mid]; // 中间项的值
        // 如果刚好相等, 则就算找出来了
        if (mid_value == value) {
          return true;
        }
        // 如果中间项比目标大, 就只要去左边的那一半中找(不含中间项)
        else if (mid_value > value) {
          new_start = start;
          new_end = mid - 1;
          return binary_search(arr, value, new_start, new_end);
        }
        // 如果中间项比目标小, 就只要去右边的那一半中找(不含中间项)
        else {
          new_start = mid + 1;
          new_end = end;
          return binary_search(arr, value, new_start, new_end);
        }
      }

      var result = binary_search(arr, search, 0, arr.length - 1);
      console.log(result); // => false

方式2:无限for循环方式实现

 var arr = [
        2,
        5,
        8,
        10,
        15,
        18,
        22,
        24,
        24,
        28,
        33,
        35,
        50,
        55,
        56,
        57,
        60,
        61,
        62,
        66,
        70,
      ];
      var search = 5; // 具体分析, 可以将该数据修改为不同的值, 比如: 2, 5, 8,
      var result = bin_search(arr, search, 0, arr.length - 1);
      console.log(result); // => true
      // 使用无限for循环方式
      function bin_search(arr, value, start, end) {
        for (i = 1; i > 0; i++) {
          if (start > end) {
            return false;
          }
          // 找出start和end的中间位置:
          var mid = Math.floor((start + end) / 2);
          var mid_value = arr[mid];
          if (mid_value == value) {
            return true;
          }
          // 中间值大于要找的目标值, 则只要去中间值的左边找:
          else if (mid_value > value) {
            start = start; // 这句代码可以省略不写
            end = end - 1;
          }
          // 中间值小于要找的目标值, 则只要去中间值的右边找:
          else if (mid_value < value) {
            start = mid + 1;
            end = end; // 这句代码可以省略不写
          }
        }
      }

 

posted @ 2021-04-20 15:47  web_cnblogs  阅读(237)  评论(0)    收藏  举报