描述
给定一个长度为n(n≤10000)的单调递增整数数列,和要查找的整数,利用折半查找算法找到该数据。输出成功找到该数据所需的比较次数;如果查找未成功,则输出0。
比如有序列: 15 25 26 34 40 41 49 57 64 74
要查找25,则查找次数为2次。
再有序列:10 19 24 30 31 41 49 54 57 61 63 65 72 78 83
要查找31,则查找次数为4次。
再有序列: 7 17 20 27 30 38 48 52 55 61 66 72 79 86
要查找17,则查找次数为4次。
上述序列如果要查找60,则应输出0(查找未成功)
格式
输入格式
输入数据为两行,第一行两个整数,第一个整数n表示序列的长度,第二个整数data,表示要查找的数据。第二行是由n个整数组成的单调递增序列。
输出格式
输出一个整数,如果找到数据,则输出找到该数据所花的比较次数;如果没有找到该数据,输出0
样例
输入样例
10 13
9 12 13 19 26 28 29 37 40 43
输出样例
3
题解及注释
#include <stdio.h>
#include <stdlib.h>
#define maxn 10005
int search(int array[],int n,int value)//array[]即使主函数的a数组
{
int low,high,mid;
low=0;
high=n-1;
int x=1;
while(low<=high)
{
mid=(low+high)/2;//这里是折半查找的很关键的一布了
if(array[mid]==value)
{
return x;
}
else
{
if(value<array[mid])
{
high=mid-1;
}
if(value>array[mid])
{
low=mid+1;
}
}
x++;
}
return 0;
}
int main()
{
int n,data;
int a[maxn];
scanf("%d%d",&n,&data);
for(int i=0;i<n;i++)//遍历输入
{
scanf("%d",&a[i]);
}
int res;
res=search(a,n,data);//调用函数,a是数组,直接传入
if(res!=0)
{
printf("%d\n",res);
}
else
{
printf("0\n");
}
}
写于2021年7月22日11:52分
如果这篇文章对你帮助很大,麻烦帮忙,点下友情链接: 鱼儿项目网(直接点这里),进去之后切换几个页面,停留几十秒。感激不尽。本站采集全网自媒体,网赚类,电商营销课程。里面有一些免费项目大家也可以看看