二分搜索
过程¶
以在一个升序数组中查找一个数为例。
.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)\)