Skip to content

二分搜索

过程

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

.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;  
}

输出为正数则代表找到该元素,返回其索引。

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

性质

时间复杂度

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

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

空间复杂度

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

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

Reference

二分 - OI Wiki