任务描述
本关任务: 假设有若干个由大到小排序的数已经顺序存放在一个数组中,现输入一个数x,请用折半查找法找出该数是数组中哪个元素的值。找到则输出数组元素的下标值;若该数不在数组中,则输出“无此数”的提示。
相关知识
为了完成本关任务,你需要掌握:
折半查找算法
折半查找算法
折半查找法是效率较高的一种查找方法。其基本思想是:设查找数据的范围下限为l=1,上限为h=5,求中点m=(l+h)/2,用X与中点元素am比较,若X等于am,即找到,停止查找;否则,若X大于am,替换下限l=m+1,到下半段继续查找;若X小于am,换上限h=m-1,到上半段继续查找;如此重复前面的过程直到找到或者l>h为止。如果l>h,说明没有此数,打印找不到信息,程序结束。
编程要求
假设有若干个由大到小排序的数已经顺序存放在一个数组中: 1.函数实现折半查找。函数原型为: int BinSearch(int arr[],int len,int key) //在长度是len的数组arr中寻找关键字key 2.主调函数实现: (1)输入一个数x,调用折半查找函数寻找该数; (2)若该数在数组中,输出该数在数组中的位置值(数组下标+1); (3)若该数不在数组中,则输出"无此数"的提示。
测试说明
平台会对你编写的代码进行测试: 假设有定义和初始化如下: int arr[]={11,10,9,8,7,6,5,4,3,2,1}; 测试输入:3 预期输出:3的位置是9
测试输入:22 预期输出:没找到22
#include<stdio.h>
#define NUM 11
int a[]={1,2,3,4,5,6,7,8,9,10,11};
int BinarySearch(int a[],int n,int key)
{
int low,high,mid;
low=0;
high=n-1;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]==key)
return mid;
else if(a[mid]>key)
high=mid-1;
else
low=mid+1;
}
return -1; //查找失败返回-1
}
int main()
{
int key,result;
scanf("%d",&key);
result=BinarySearch(a,NUM,key);
if(result>=0)
printf("%d的位置是%d\n",key,12-(result+1));
else
printf("没找到%d\n",key);
return 0;
}
作者码字不易,给个赞支持一下吧。