惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
雷峰网
雷峰网
Last Week in AI
Last Week in AI
T
Tailwind CSS Blog
V
Visual Studio Blog
Jina AI
Jina AI
博客园 - 司徒正美
The Cloudflare Blog
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
S
SegmentFault 最新的问题
博客园 - 三生石上(FineUI控件)
有赞技术团队
有赞技术团队
小众软件
小众软件
V
V2EX
Apple Machine Learning Research
Apple Machine Learning Research
美团技术团队
博客园 - 【当耐特】
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
WordPress大学
WordPress大学
爱范儿
爱范儿
月光博客
月光博客
大猫的无限游戏
大猫的无限游戏

博客园 - Eagle6970

ASP.NET Core实现MCP Streamable HTTP 豆包生成C#微博API HTTP调用实例代码 豆包生成C#即梦API HTTP调用实例代码 SQL Server - sp_spaceused 子网掩码和IP地址范围 [VS Code] Run JavaScript [VS Code] Copy所有包含关键字的行 [数据结构学习笔记25] 归并排序(Merge Sort) [VS Code] 使用dotnet CLI安装和管理NuGet包 [数据结构学习笔记24] 选择排序(Selection Sort) [数据结构学习笔记23] 插入排序(Insertion Sort) [数据结构学习笔记22] 冒泡排序(Bubblesort) [数据结构学习笔记21] 快速排序(Quicksort) [数据结构学习笔记20] 深度优先搜索(DFS)和广度优先搜索(BFS) [数据结构学习笔记19] 二叉树遍历(Binary Tree Traversal) [数据结构学习笔记17] 线性查找(Linear Search) [数据结构学习笔记16] 汉诺塔(Towers of Hanoi) [数据结构学习笔记15] 斐波那契数列(Fibonacci) [数据结构学习笔记14] 递归简介(Recursion)
[数据结构学习笔记18] 二分查找(Binary Search)
Eagle6970 · 2025-01-18 · via 博客园 - Eagle6970

二分查找有一个最关键的前提,查找的集合必须是排好序的!它的思想是分而治之。

给定数组:1,3,5,10,32,40,60,71,80,99

查找:60

1. 找到中间点

分两种情况:

1. 奇数个元素,很容易找到中间点

a, b, c, d, e -> c是中间点

2. 偶数个元素,我们取中间偏左位置

a, b, c, d, e, f -> c是中间点

所以对于我们的数组,32是我们的中间点。

2. 比较32和60,显然32 < 60,如果要查找的值比中间值大,那要查找的值一定在右半部分;反之,在左半部分。那么我们要在32的右半部分查找

1,3,5,10,3240,60,71,80,99

3. 找到右半部分的中间点

40,60,71,80,99

4. 71 > 60,那接下来往左半部分查找

5. 找到左半部分的中间点

40,60

6. 40 < 60,往右半部分查找

7. 中间点是60

60

8. 查找结束,成功!

代码实现(javascript)

循环的方式:它不会造成函数调用栈膨胀。

function binarySearch(arr, val) {
  let start = 0;
  let end = arr.length - 1;

  while (start <= end) {
     let middleIndex = Math.floor((start + end) / 2);
     if (arr[middleIndex] === val) {
          return middleIndex;
      } else if (arr[middleIndex] < val) {
          start = middleIndex + 1;
      } else {
          end = middleIndex - 1;
      }
  }  

  return -1;
}

递归的方式:效率不及循环的方式,因为会有调用栈膨胀的问题。

function binarySearch(arr, val, start = 0, end = arr.length - 1) {
  const middleIndex = Math.floor((start + end) / 2);
  if (val === arr[middleIndex]) {
     return middleIndex;
  }  
  if (start >= end) {
       return -1;
   }
   if (val < arr[middleIndex]) {
       binarySearch(arr, val, start, middleIndex - 1);
   } else {
       binarySearch(arr, val, middleIndex + 1, end);
   }
}

二分查找的时间复杂度是O(log n)。