二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
【思想】:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功
【算法要求】
(1)必须采用顺序存储结构 ( 2)必须按关键字大小有序排列。
【算法分析】
(1) 该问题可以分解为若干个规模较小的相同问题;
(2)分解出的子问题的解可以合并为原问题的解;
(3)分解出的各个子问题是相互独立的。
(4)该问题的规模缩小到一定的程度就可以容易地解决;
【算法复杂度】:假设其数组长度为n,其算法复杂度为o(logn)
(1) 该问题可以分解为若干个规模较小的相同问题;
(2)分解出的子问题的解可以合并为原问题的解;
(3)分解出的各个子问题是相互独立的。
(4)该问题的规模缩小到一定的程度就可以容易地解决;
【算法复杂度】:假设其数组长度为n,其算法复杂度为o(logn)
据此容易设计出二分搜索算法
template<class Type>
int BinarySearch(Type a[], const Type& x, int l, int r)
{
while (r >= l){
int m = (l+r)/2;
if (x == a[m]) return m;
if (x < a[m]) r = m-1; else l = m+1;
}
return -1;
}
【C语言实现代码】
#include<stdio.h>
#define N 10
int main()
{
int i,j,t,a[N];
int find;
printf("Please input %d numbers into a array\n",N);
for(i=0;i<N;i++) //接收数组元素
scanf("%d",&a[i]);
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++)
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
printf("The array is:\n");
for(i=0;i<N;i++)
printf("a[%d]=%d ",i,a[i]);
printf("\nPlease input you want to find value:");
scanf("%d",&find);
int left=0;
int right=N-1;
int flag=0,mid;
while(left<=right)
{
mid=(left+right)/2;
if(mid==find)
{
flag=1;
break;
}
else if(find>mid)
left=mid+1;
else
right=mid-1;
}
if(flag)
printf("The value found at:a[%d]=%d\n",mid,a[mid]);
else
printf("The value is not found!\n");
return 0;
}
【运行结果】