二分查找(又称为折半查找)是在有序序列中查找比较多的查找算法,基本思路:设有一个从小到大的序列,取中间的元素m进行比较,如果等于需要查找的元素x则返回元素m的下标,若x大于m则再从右边的区间查找,若x小于m则再从左边的区间查找,这样每次减少一半的查找范围。时间复杂度为O(lgn),查找速度相对顺序查找要快很多,但是查找的数据序列必须是有序序列(即数据是从小到大或从大到小排序的).
第一种方法
//折半查找的先决条件是查找表中的数据元素必须有序
#include <stdio.h>
#define N 5
int main()
{
int a[N],i,mid,low=0,high=N-1,num;
for(i=0;i<N;i++)
scanf("%d",&a[i]);
scanf("%d",&num);
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]==num)
{
printf("%d已找到,第%d个元素",num,mid+1);
break;
}
else if(a[mid]<num)
low=mid+1;
else
high=mid-1;
}
if(low>high)
printf("未找到该数");
return 0;
}
第二种方法(递归)
#include <stdio.h>
#define N 5
int BinSerch(int s[],int low,int high,int num)
{
int mid;
if(low>high)
return -1;
else
{
mid=(low+high)/2;
if(s[mid]==num)
return mid;
else if(s[mid]<num)
return BinSerch(s,mid+1,high,num);
else
return BinSerch(s,low,mid-1,num);
}
}
int main()
{
int a[N],i,num,result;
for(i=0;i<N;i++)
scanf("%d",&a[i]);
printf("请输入要查找的数:\n");
scanf("%d",&num);
result=BinSerch(a,0,N-1,num);
if(-1!=result)
printf("%d存在,为第%d个元素",num,result+1);
else
printf("查找失败");
return 0;
}