295 字
1 分钟
二分搜索
文章目录
过程
以在一个升序数组中查找一个数为例。
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代表大于所有元素
性质
时间复杂度
二分查找的最优时间复杂度为 。
二分查找的平均时间复杂度和最坏时间复杂度均为 。因为在二分搜索过程中,算法每次都把查询的区间减半,所以对于一个长度为 的数组,至多会进行 次查找。
空间复杂度
迭代版本的二分查找的空间复杂度为
递归(无尾调用消除)版本的二分查找的空间复杂度为