/*
假设一个长度为n的一维数组a中的元素是从小到大有序排列的,编写一个函数
利用折半法在数组中查找一个值为k的元素,如果找到,返回该元素在数组中的
下标,否则返回-1
分析:折半查找法的基本思想:
设数组的下标下界为low(开始low=0),上界为high(开始high=n-1),如果low<=high
则进入下面的循环:
(1)取中间位置mid=(low+high)/2
(2)将下标为k和mid的元素相比较,有三种情况:
若k<a[mid],则说明如果数组中存在其值等于k的元素,它必定在数组下标low到mid-1
的范围内,这时,令high=mid+1;把查找范围缩小了一半,进入下一次循环
若k>a[mid],则说明如果数组中存在其值等于k的元素,它必定在数组下标为mid+1到
high的范围内,这时令low=mid+1,把查找范围缩小了一半,进入下一次循环
若k=a[mid],则说明找到了值为k的元素,返回mid,即值为k的元素的下标
上面的循环如果low>high则循环结束,即查找范围为负,说明数组中不存在其值为k的
元素,返回-1
*/
#include <stdio.h>
int Search_Bin(int s[],int n,int k) //数组,数组长度,要查找的值
{
int low,high,mid;
low=0; //low为查找区间下标的下界,其初值为0
high=n-1; //high为查找区间下标的上界,其初值为n-1
while(low<=high) //当查找区间(即high-low)大于等于0时的循环
{
mid=(low+high)/2; //取中间位置
printf("low=%d,mid=%d,high=%d\n",low,mid,high);
if(k==s[mid])
return mid; //若k与mid位置上的元素值相等则找到待查元素,返回其下标
if(k<s[mid])
high=mid-1;
else
low=mid+1; //继续在后半区间进行查找
}
return -1; //low>high时上面的循环结束,表明数组中不存在待查元素,返回-1
}
int main()
{
int a[10],k,i,j;
printf("请按照从小到大的顺序输入10个数组中的元素:\n");
for(i=0;i<10;i++) //按照顺序输入数组的元素
scanf("%d",&a[i]);
printf("请输入要查找的值:");
scanf("%d",&k);
j=Search_Bin(a,10,k); //调用函数Search_Bin,在数组a中查找值为k的元素,返回值赋给j
if(j!=-1)
printf("找到了!值为%d的元素在数组中的下标为%d\n",k,j);
else printf("没有找到!查找失败!\n");
return 0;
}
/*
#include <stdio.h>
void main()
{
int a[10],num,low,high,mid,i,flag=0;
printf("input the array:\n");
for(i=0;i<=9;i++)
{
scanf("%d",&a[i]);
}
printf("input finding number:");
scanf("%d",&num);
low=0;
high=9;
while(low<=high)
{
mid=(low+high)/2;
printf("low=%d,mid=%d,high=%d\n",low,mid,high);
if(a[mid]>num)
{
high=mid-1;
}
if(a[mid]<num)
{
low=mid+1;
}
if(a[mid]==num)
{
flag=1;
break;
}
}
if(flag)
{
printf("found!\n");
}
else
{
printf("not found!\n");
}
}
*/
///上下两个都是一样的,要注意的是while(low<=high) 是小于等于,不能少了那个等号
05-17
1815

02-25
1950

03-27