【发布时间】:2015-07-25 04:01:29
【问题描述】:
我有几个关于二分搜索的问题。
- 在下面的代码中,我从 main 传递 fun(array, 0, len-1)。是否也可以将“len”作为结束索引传递?我认为没关系,也有经过验证的答案。
我觉得唯一的区别是在中间元素之后的数组部分会少计算一次,而在中间元素之前的数组部分会额外计算一次。
- 此外,在执行 mid = (s+e)/2 时,通常整数除法采用底值。如果我们做 mid = (ceiling)(s+e)/2。同样,我觉得唯一的区别是在中间元素之后的数组部分将少计算一次,而在中间元素之前的数组部分将多计算一次。
下面是我的代码
#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");
}
【问题讨论】:
-
你到底想用 printf("Array : ",print(a)); 做什么?您需要使用 for 循环来打印数组中的所有值。此外,您已经静态初始化了数组。那你为什么要计算 len 呢?
-
@abhishek_naik,忘记复制打印功能。请参阅上面的编辑。
-
请注意,
print()的输出将出现在函数printf()的任何输出之前,该函数通过(但不使用)来自print()的不存在的返回值。这不会给您想要的结果;标签将出现在数据之后,而不是之前。 -
如果你尝试搜索一个空数组怎么办?
-
另外,如果
len不代表数组的长度,那会非常令人困惑。定义清晰的语义:你希望它代表数组长度,还是希望它代表最后一个有效索引?
标签: c arrays binary-search