295 字
1 分钟

二分搜索

2025-04-24
无标签
文章目录

过程#

以在一个升序数组中查找一个数为例。

.Net的实现
internal static int InternalBinarySearch(
T[] array,
int index,
int length,
T value,
IComparer<T> comparer)
{
int num1 = index;
int num2 = index + length - 1;
while (num1 <= num2)
{
int index1 = num1 + (num2 - num1 >> 1);
int num3 = comparer.Compare(array[index1], value);
if (num3 == 0)
return index1;
if (num3 < 0)
num1 = index1 + 1;
else
num2 = index1 - 1;
}
return ~num1;
}
  1. 输出为正数则代表找到该元素,返回其索引。

  2. 输出为负数则代表未找到该元素,返回其插入位置的索引取反。其中 ~0 代表小于所有元素,~length 代表大于所有元素

性质#

时间复杂度#

二分查找的最优时间复杂度为 O(1)O(1)

二分查找的平均时间复杂度和最坏时间复杂度均为 O(logn)O(\log n)。因为在二分搜索过程中,算法每次都把查询的区间减半,所以对于一个长度为 nn 的数组,至多会进行 O(logn)O(\log n) 次查找。

空间复杂度#

迭代版本的二分查找的空间复杂度为 O(1)O(1)

递归(无尾调用消除)版本的二分查找的空间复杂度为 O(logn)O(\log n)

Reference#

二分 - OI Wiki