【问题标题】:binary search pointers dynamic memory allocation recursion二分查找指针动态内存分配递归
【发布时间】:2015-07-18 05:51:13
【问题描述】:

我正在使用指针和动态内存分配实现二进制搜索。我首先对元素列表进行排序,然后执行搜索。排序部分工作正常,但我的搜索工作不正常。我知道算法是正确的,但我不知道如何处理语法。有人可以帮我吗? PS这是我关于堆栈溢出的第一个问题,顺便说一句。 :)

#include <stdio.h>
#include <stdlib.h>

int binary_search(int x,int start,int end, int *array)
{
   int q;
   q=(start+end)/2;
   if(x==*(array+q))
   {
      return q;
   }
   else if (x>*(array+q))
   {
      binary_search(x,q+1,end,array);
   }

   else if (x<*(array+q))
   {
      binary_search(x,start,q-1,array);
   }

   else if(start>=end)
      return -1;
}

int main()
{
   int n,*a,tmp,i,j,search,pos;
   printf("Enter n");
   scanf("%d",&n);
   a=malloc(sizeof(int)*n);

   for(i=0;i<n;i++)
   {
      scanf("%d",&tmp);
      *(a+i)=tmp;
   }

   for(i=0;i<n-1;i++)
   {
      for(j=0;j<n-1;j++)
      {
         if(*(a+j)>*(a+j+1))
         {
            tmp=*(a+j);
            *(a+j)=*(a+j+1);
            *(a+j+1)=tmp;
         }
      }
   }

   printf("Sorted elements are\n");
   for(i=0;i<n;i++)
   {
      printf(" %d",*(a+i));
   }

   printf("Enter element to search\n");
   scanf("%d",&search);
   pos=binary_search(search,0,n-1,&a);
   printf("\nThe element is located at position %d",pos);

   return 0;
}

【问题讨论】:

  • "搜索不正常究竟是什么不工作。

标签: c pointers recursion binary-search dynamic-memory-allocation


【解决方案1】:

除了以上答案-

int binary_search(int x,int start,int end, int *array)
                                                ^integer pointer

但在 main 中,您传递给它的是 int ** 类型-

pos=binary_search(search,0,n-1,&a);
                               ^a is already an integer pointer

编译器会发出警告。 只需在此传递a。你也忘了freea,因为你已经使用malloc为其分配了内存。

【讨论】:

    【解决方案2】:

    首先,*(array+q)array[q] 相同。

    其次,您应该在发布问题之前进行一些研究。 http://www.cquestions.com/2008/01/c-program-for-binary-search-through.html

    如果要查找的号码不存在,则进入无限循环。 这应该可以解决它。

    int binary_search(int x,int start,int end, int *a)
    {
        int q;
        if(start>end)
            return -1;
        q=(start+end)/2;
        if(x==*(a+q))
        {
            return q;
        }
        else if (x>*(a+q))
        {
            return binary_search(x,q+1,end,a);
        }
    
        else if (x<*(a+q))
        {
            return binary_search(x,start,q-1,a);
        }
    
    }
    

    【讨论】:

    • 虽然基本正确,但我觉得应该是if(start &gt; end)
    • 是的,应该是。修复它
    【解决方案3】:

    您忘记在递归调用中添加return。结果,函数在没有正确返回值的情况下结束。

    此外,检查if(start&gt;=end) 需要在最顶部执行。否则,当x 不在array 中时,您将看到无限递归。

    更新:

    int binary_search(int x,int start,int end, int *array)
    {
       int q;
    
       if(start>=end)
          return -1;
    
       q=(start+end)/2;
    
       if(x==*(array+q))
       {
          return q;
       }
       else if (x>*(array+q))
       {
          // Add return
          return binary_search(x,q+1,end,array);
       }
    
       // There is no need to do any further checks.
       return binary_search(x,start,q-1,array);
    }
    

    【讨论】:

    • 在我看来,else if(start&gt;=end) 似乎从未达到,因为x 的所有可能情况都已被覆盖,因此丢失的最终return 也永远不会被读取,因此其唯一目的是使编译器静音。
    • @alk 最终会达成的!如果没有找到元素。
    • 不,我们有三个返回语句,一个用于x==,一个用于x&lt;,一个用于x&gt;。在任何情况下都匹配其中之一。
    • @alk 如果找不到它最终会。这是因为如果 *(a+q) 大于或小于 x,我们调整 'start' 和 'end',从而导致 start>=end csit.parkland.edu/~mbrandyberry/CS1Java/Lessons/Lesson27/…
    • 还有什么x可以相等,更少或更多*(array+q)??? (参考代码显示)
    猜你喜欢
    • 2019-07-12
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 2015-12-16
    • 2019-06-24
    • 2013-10-04
    • 1970-01-01
    相关资源
    最近更新 更多