简介
二分法查找(Binary Search)又称为折半查找(Half-Interval Search),是一种针对有序数列的查找方法。
时间复杂度
每次把搜索区域减少一半
最差:
O(logn)
最优:
O(1)
空间复杂度
迭代:
O(1)
递归:
O(logn)
工作原理如下:
- 判断查找范围最大值与最小值是否相等:
- 如果相等,则取查找范围下标的中间值,并与所需要的查找的值进行比较:
- 如果等于,则该中间值的下标就是所要查找的值的下标,即找到该值并返回下标。
- 如果大于,则需要查找的值在中间值的左边,将查找范围最大值设置为中间值,然后重复第一个步骤。
- 如果小于,则需要查找的值在中间值的右边,将查找范围最小值设置为中间值,然后重复第一个步骤。
- 如果不相等,即未查找到所需要查找的值并返回-1或错误码。
- 如果相等,则取查找范围下标的中间值,并与所需要的查找的值进行比较:
C++实现
#include <stdio.h>
//非递归实现
int BinarySearch(int numbers[], int length, int value)
{
int begin = 0;
int end = length - 1;
int mid = 0;
while (begin < end)//当没有可查询的元素时退出
{
mid = (begin + end) / 2;//平分数组
if (numbers[mid] == value)
{
return mid;//查找到返回下标
}
else if (numbers[mid] > value)
{
end = mid;//需要查找到的数在左边
}
else
{
begin = mid;//需要查找到的数在右边
}
}
return -1;
}
//递归实现
int BinarySearchRecursively(int numbers[], int begin, int end, int value)
{
if (begin >= end)//当没有可查询的元素时退出
{
return -1;
}
int mid = (begin + end) / 2;//平分数组
if (numbers[mid] == value)
{
return mid;//查找到返回下标
}
else if (numbers[mid] > value)
{
end = mid;//需要查找到的数在左边
}
else
{
begin = mid;//需要查找到的数在右边
}
return BinarySearchRecursively(numbers, begin, end, value);//继续递归
}
void main()
{
int numbers[] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 };
int value = 17;
printf("Index1 = %d\n", BinarySearch(numbers, 20, value));
printf("Index2 = %d\n", BinarySearchRecursively(numbers, 0, 19, value));
}