二分查找是一个常用的查找算法,其原理在于通过不断切分一个规则排序,对半的去寻找目标元素所在的区间与位置。但是其有一个前提,那就是数据结构需要是顺序存储结构,并且关键字大小有序排列。例子如下:
例:
有一个数列:12,23,45,56,67,89 请使用二分查找找到56的位置
解:
首先mid=(0+5)/2=2;
arr[2]位置放的是45,56大于45,所以在56,67,89之间进行查找,mid=(3+5)/2=4,arr[4]=67,这时67大于56,所以mid=(3+3)/2=3,arr[3]=56,成功找到56的位置,返回index=3
算法实现如下:
void HalfSearch(int arr[], int low, int high,int key)
{
int count = 0;
int count1 = 0;
while (low<=high)
{
count++;
int mid = (low + high) / 2;
if (key > arr[mid] )
{
low = mid + 1;
}
else if ( key < arr[mid])
{
high = mid - 1;
}
else
{
printf_s("查找到元素%d,位置arr[%d],查找次数%d", key, mid,count);
count1++;
break;
}
}
if (count1 == 0)
{
printf_s("查找失败!");
}
}
void main()
{
int arr[6] = { 12,23,33,66,88,99 };
HalfSearch(arr,0,5,66);
}
二分搜索时间复杂度为:O(log2n)
因为二分查找每次去掉一半的值,所以对于n个元素的情况:
一次二分剩下:n/2
两次二分剩下:n/2/2 = n/4
…
m次二分剩下:n/(2^m)
在最坏情况下是在排除到只剩下最后一个值之后得到结果,即
n/(2^m)=1
所以由上式可得 : 2^m=n
故时间复杂度为: O(log2n)