一.题目要求
·题目
输入n(n<100)个有序正数,请用折半查找算法,查找x在其中的位置。
·测试
输入:5 1,2,3,4,5 2
输出:2
注:测试集合中,x数一定在正数数组中。即不用处理错误逻辑。
二.题目分析
- 输入的第一个数是数的个数,第二组数是一组有序的数,即不需要自己排序,第三个数则是要查找的数。
- 折半查找,也称二分查找,即利用二分法进行查找。在某些情况下相比于顺序查找,使用折半查找算法的效率更高。但是该算法的使用的前提是静态查找表中的数据必须是有序的。
三.代码实现
#include <stdio.h>
int main() {
int n, i;
int series[100];
int t;
int right, left, middle;
//输入
scanf_s("%d", &n);
for (i = 0; i < n; i++) {
scanf_s("%d,", &series[i]);
}
scanf_s("%d", &t);
//初始化
left = 0;
right = n - 1;
middle = (n - 1) / 2;
//二分法查找
while (series[middle] != t) {
if (series[middle] < t) right = middle;
else left = middle;
middle = (left + right) / 2;
}
printf("%d", middle);
return 0;
}
好吧,上面的代码还是运行不了(似曾相识)。
调试的时候发现数组元素的输入没有成功,但是没有找到错误的原因。
然后我在网上找到了小刘同学分享的代码。
点击跳转到:折半查找
#include <stdio.h>
int main()
{
int num[100];
int a,b,flag,i=0;
scanf("%d",&a);
for(i=0;i<a;i++)
{
scanf("%d,",&num[i]);
}
scanf("%d",&b);
int left=0,right=a-1;
while(left<=right)
{
flag = (left+right)/2;
if(b==num[flag])
{
printf("%d",flag+1);
break;
}
if(num[flag] > b)
right = flag-1;
else if(num[flag] < b)
left = flag+1;
}
}
我对比了一下,除了二分查找的实现部分,前面的不TM是一样的吗。。。
大家来找找错误。