[英]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.