折半查法(C语⾔实现)递归
⼆分查(⼜称为折半查)是在有序序列中查⽐较多的查算法,基本思路:设有⼀个从⼩到⼤的序列,取中间的元素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)tm network
{
mid=(low+high)/2;
if(a[mid]==num)
{
printf("%d已到,第%d个元素",num,mid+1);
break;
else if(a[mid]<num)
low=mid+1;
else2008tv
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;
}