簡體   English   中英

二進制搜索指針動態內存分配遞歸

[英]binary search pointers dynamic memory allocation recursion

我正在使用指針和動態內存分配來實現二進制搜索。 我首先對元素列表進行排序,然后執行搜索。 排序部分工作正常,但我的搜索無法正常工作。 我知道算法是正確的,但我不知道該如何處理語法,有人可以幫我嗎? 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;
}

除了以上答案-

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 而且您還忘記了free a因為您已經使用malloc為它分配了內存。

首先, *(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);
    }

}

您忘記了在遞歸調用中添加return 結果,該函數在沒有適當返回值的情況下終止。

另外,檢查if(start>=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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM