二进制搜索中的结束索引

时间:2015-07-25 04:01:29

标签: c arrays binary-search

我在二元搜索中有几个问题。

  1. 在我下面的代码中,我从main传递乐趣(数组,0,len-1)。传递'len'作为结束指数也可以吗?我认为没关系,也验证了答案。
  2. 我觉得唯一的区别是,在mid元素后面的数组部分会有一个较少的计算,而在mid元素之前的数组部分会有一个额外的计算。

    1. 此外,在执行mid =(s + e)/ 2时,通常整数除法取底值。如果我们做mid =(ceiling)(s + e)/ 2怎么办?同样,我觉得唯一的区别是,在mid元素后面的数组部分会有一个较少的计算,而在mid元素之前的数组部分会有一个额外的计算。
    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");
      }
      

3 个答案:

答案 0 :(得分:1)

是的,传递lenlen-1只会改变递归调用次数,对于元素中间元素和元素中间元素后的元素,它会有所不同。

使用ceil也是如此。因此,基于数组中的index,不同元素的递归调用数可能会有所不同。

这两项更改都会为您提供正确的结果。

答案 1 :(得分:0)

  1. 如果您通过len代替len-1,它将不会发生太大变化。如果len为奇数,则len-1将为偶数,并且两者都会给出相同的mid值。
    如果len是偶数,那么你在中间位置有两个元素。这里len-1将为我们提供第一个中间点,len将给出第二个中间点。
  2. 如果您使用ceil((s+e)/2)获得mid位置,那么即使len也不会影响更多,即使您通过{{},它也会提供第二个中间位置{ {1}}或len。但是在奇数len-1的情况下,如果您将len作为len传递,那么它将不会生成偶数分区。如果您通过e
  3. ,也没关系

答案 2 :(得分:0)

您可以传递lenlen-1,而不会对结果进行任何更改,只会在最后一个索引处找不到该值。

如果您更改此行len = sizeof(a)/sizeof(*a) - 1;

len = sizeof(a)/sizeof(*a);

然后lenlen-1都可以正常使用。

此外,您应该返回fun函数以获取值,并在主函数中打印之前检查它。