我在二元搜索中有几个问题。
我觉得唯一的区别是,在mid元素后面的数组部分会有一个较少的计算,而在mid元素之前的数组部分会有一个额外的计算。
我的代码
#include <stdio.h>
int key = 0;
int len = 0;
int main(void)
{
int a[] = {1,2,3,4,5,6,7,8,9};
printf("Enter key : ");
scanf("%d",&key);
len = sizeof(a)/sizeof(*a) - 1;
printf("Array : ",print(a));
//printf("Element found at index : %d",fun(a,0,len-1));
printf("Element found at index : %d",fun(a,0,len));
printf("\n");
return 0;
}
int fun(int a[], int s, int e)
{
int mid = 0;
mid = (s+e)/2;
if(a[mid] == key)
return mid;
if(s == e)
return -1;
if(a[mid] > key)
fun(a,s,mid-1);
else
fun(a,mid+1,e);
}
int print(int a[])
{
int i = 0;
for(i=0;i<len;i++)
printf("%d ",a[i]);
printf("\n");
}
答案 0 :(得分:1)
是的,传递len
和len-1
只会改变递归调用次数,对于元素中间元素和元素中间元素后的元素,它会有所不同。
使用ceil
也是如此。因此,基于数组中的index
,不同元素的递归调用数可能会有所不同。
这两项更改都会为您提供正确的结果。
答案 1 :(得分:0)
len
代替len-1
,它将不会发生太大变化。如果len
为奇数,则len-1
将为偶数,并且两者都会给出相同的mid
值。len
是偶数,那么你在中间位置有两个元素。这里len-1
将为我们提供第一个中间点,len
将给出第二个中间点。 ceil((s+e)/2)
获得mid
位置,那么即使len
也不会影响更多,即使您通过{{},它也会提供第二个中间位置{ {1}}或len
。但是在奇数len-1
的情况下,如果您将len
作为len
传递,那么它将不会生成偶数分区。如果您通过e
。答案 2 :(得分:0)
您可以传递len
和len-1
,而不会对结果进行任何更改,只会在最后一个索引处找不到该值。
如果您更改此行len = sizeof(a)/sizeof(*a) - 1;
到len = sizeof(a)/sizeof(*a);
然后len
和len-1
都可以正常使用。
此外,您应该返回fun
函数以获取值,并在主函数中打印之前检查它。