【问题标题】:Index is not priting and code is freezing in binary search program索引未打印并且代码在二进制搜索程序中冻结
【发布时间】:2016-08-31 04:11:55
【问题描述】:

我做了一个二分查找程序,在打印数组的索引值之前遇到了程序冻结的问题。 变量 high 用于最后一个索引,low 用于数组的第一个索引。 特此附上代码

// binary search
#include<stdio.h>
#include<conio.h>
int binary(int a[],int n,int x);
void main()
{
    int arr[10];
    int i,x,n,r;
    clrscr();
    printf("Enter number of data elements");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }
    printf("Enter the element to be search");
    scanf("%d",&x);
    r=binary(arr,n,x);
    if(r==-1)
    {
        printf("Not found");
    }
    else
    {
        printf("Found : %d",r);
    }
    getch();
}
int binary(int a[],int n,int x)
{
    int high=n-1;
    int low=0;
    int result=-1,mid;
    while(low<=high)
    {
        mid=(high+low)/2;
        if(x==a[mid])
        {
            result=mid;
        }
        else if(x<a[mid])
        {
            high=mid-1;
        }
        else if(x>a[mid])
        {
            low=mid+1;
        }
    }
    return (result);
}

【问题讨论】:

  • 你做过任何基本调试吗?即使用调试器和/或调试打印语句来跟踪程序的执行?
  • binary 中,您需要在找到搜索项时跳出循环。我用调试器花了 30 秒才找到它。
  • 是的,我使用了while循环,最后我返回了最终结果
  • 我想你不明白。您需要在 if(x==a[mid]) 块中使用 break 语句。

标签: c search binary-search


【解决方案1】:

逻辑有问题,

mid=(high+low)/2;
if(x==a[mid])
{
    result=mid;
}

如果这个 if 语句的计算结果为真,那么你就陷入了一个无限循环,因为你没有改变“低”或“高”,while 语句总是计算为“真”,而且这个 if 也计算为真,因为'mid' 是 'high' 和 'low' 的函数。

一个可能的解决方法是添加一个 break 语句,或引发一个标志,这应该被检查。

【讨论】:

  • 我没有遇到问题
  • 正确分析问题。可以通过明确说明如何解决问题来改进答案。
【解决方案2】:

稍微修改一下你的代码:

mid=(high+low)/2;
    if(x==a[mid])
    {
        result=mid;
         break;       // to break the infinite loop
    }

如上所述,您的代码中只需要 break 语句;其他一切似乎都很好。 希望它会有所帮助。

【讨论】:

    【解决方案3】:

    当数组中存在目标的情况下,当低和高相等时,二进制函数中的 while 循环将进入无限循环。当你在这里得到结果时,你并没有打破循环

    if(x==a[mid])
    {
            result=mid;
    }
    

    在得到结果退出循环后,在这个 if 语句中应用一个 break 语句。

    附:您假设要在此处对输入进行排序。尽量不要这样做。

    【讨论】:

    • @user6547375 请尝试空运行一个小测试用例。您将自己在代码中找到问题。
    • going into an infinite loop when low and high becomes equal 请重新考虑。每当low == high 时,if 语句都不会变为真
    • ^ 是的,我正在考虑目标已经存在于数组中的情况。
    猜你喜欢
    • 2021-12-15
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多