hjp3192457033 2022-11-10 12:02 采纳率: 66.7%
浏览 49
已结题

折半查找法寻找一组数字中的某个数字的位置

利用折半查找法寻找一组数字中的某个数字的位置,输入数组中的数字后,却显示无此数

#include<stdio.h>
int main()
{
int x,s;
int a[15]={0,5,13,19,21,27,56,54,75,80,88,92,105,121,160};
scanf("%d,%d",&x);
int low=0,high=14,middle;
middle=(low+high)/2;
for( ;x!=a[middle]; )
{
middle=(low+high)/2;
if(x>a[middle])
{
low=middle+1;
if(low>high)
{
break;
}
}
else
{
high=middle-1;
if(low>high)
{
break;
}
}
}
s=middle+1;
if(low>high)
printf("无此数\n");
else
printf("%d\n",s);
}

无报错,运行结果有问题

利用折半查找法找到一组数字中某个数字的位置

  • 写回答

2条回答 默认 最新

  • lzl2040 人工智能领域新星创作者 2022-11-10 12:24
    关注

    a[mid] > x的时候再更新右边的,等于的时候不用更新

    #include<stdio.h>
    int main()
    {
        int x,s;
        int a[15]={0,5,13,19,21,27,56,54,75,80,88,92,105,121,160};
        scanf("%d,%d",&x);
        int low=0,high=14,middle;
        middle=(low+high)/2;
        for( ;x!=a[middle]; )
        {
            middle=(low+high)/2;
            if(x>a[middle])
            {
                low=middle+1;
                if(low>high)
                {
                    break;
                }
                //printf("left:%d right:%d\n",low,high);
            }
            else if(x<a[middle])
            {
                high=middle-1;
                if(low>high)
                {
                    break;
                }
                //printf("left:%d right:%d\n",low,high);
            }
        }
        printf("left:%d right:%d\n",low,high);
        s=middle+1;
        if(low>high)
            printf("无此数\n");
        else
            printf("%d\n",s);
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月18日
  • 已采纳回答 11月10日
  • 创建了问题 11月10日

悬赏问题

  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line