折半查找——精选推荐

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

折半查找
⼀.题⽬要求
·题⽬
输⼊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~是⼀样的吗。

编译器报错说series使⽤了空的存储空间,我还因为是前⾯输⼊部分有误。

⼤家不妨来找找错误。

·调试ing
·思考ing
·调试ing
·思考ing
·调试ing
·思考ing
·调试ing
·思考ing
·调试ing
·思考ing
历经千⾟万苦,终于找到错误了。

其实是很低级的错误,⼆分查找的循环⾥⾯left和right弄反了。

另外,还没有考虑到要找的数就是端点值的情况。

四.修改
#include <stdio.h>
#include <math.h>
int main() {
int n, i;
int series[100];
int target;
int right, left, middle;
//输⼊
scanf_s("%d", &n);
for (i = 0; i < n; i++) {
scanf_s("%d,", &series[i]);
}
scanf_s("%d", &target);
//初始化
left = 0;
right = n - 1;
middle = (n - 1) / 2;
//⼆分法查找
if (series[right] == target) printf("%d", n);
else if ((series[left] == target)) printf("%d", 1);
else {
while (series[middle] != target) {
if (series[middle] < target) left = middle;
else right = middle;
middle = (left + right) / 2;
}
printf("%d", middle + 1);
}
return 0;
}。

相关文档
最新文档