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

推荐订阅源

量子位
雷峰网
雷峰网
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
有赞技术团队
有赞技术团队
阮一峰的网络日志
阮一峰的网络日志
Last Week in AI
Last Week in AI
G
Google Developers Blog
腾讯CDC
B
Blog
Microsoft Azure Blog
Microsoft Azure Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Microsoft Security Blog
Microsoft Security Blog
人人都是产品经理
人人都是产品经理
博客园_首页
T
Tailwind CSS Blog
C
Check Point Blog
博客园 - 【当耐特】
MongoDB | Blog
MongoDB | Blog
A
About on SuperTechFans
Y
Y Combinator Blog
L
LangChain Blog
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI

博客园 - 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)。