6、折半查找(升序)
思路:N个按照从小到大排列好顺序的数,再从中寻找一个数,不是依次扫描每个数,而是
先把这组数的中间元素拿出来与所找的数比较,如果中间数小于所找的数,则在这组数的后
半段寻找;如果中间数大于所找的数,则在这组数的前半段寻找。找到了,输出这个数的下
标,如果找不到,输出Notfound!。
完整程序
#include<stdio.h>
#define N 10
int main()
{
int a[N],low=0,high=N-1,mid,i,key,flag=0;
for(i=0;i<N;i++)
scanf("%d",&a[i]);
scanf("%d",&key);
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]==key)
{
printf("Found! The index if%d",mid);
flag=1;
break;
}
else if(a[mid]>key) high=mid-1;
else low=mid+1;
}
if(!flag) printf("Not found!");
return 0;
}
封装函数
int zheban(int a[N],key)
{
int low=0,high=N-1,mid;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]==key)
{
printf("Found! The index if%d",mid);
return mid;
}
else if(a[mid]>key) high=mid-1;
else low=mid+1;
}
printf("Not found!");
return -1;
}
调用函数
#include<stdio.h>
#define N 10
int main()
{
int a[N],low=0,high=N-1,mid,i,key,flag=0;
int zheban(int a[N],key);
for(i=0;i<N;i++)
scanf("%d",&a[i]);
scanf("%d",&key);
zheban(a,key);
return 0;
}