2014-09-21 58 views
-1

在书的上下文是给我的功能----Qustion在3.3章书K&R

/* binsearch find x in v[0] <= v[1] <= ... <= v[n-1] */ 
int bin(int x, int v[] , int n) 
{ 
    int low, high , mid; 

    low = 0; 
    high = n -1; 
    while(low <= high) { 
      printf("LOL\n"); 
      mid = (low+high)/2; 
      if(x < v[mid]) 
      high = mid + 1; 
      else if (x> v[mid]) 
      low = mid + 1; 
      else return mid; 

      } 
return -1;  
} 

这是功能文本: 二进制搜索第一x到的中间元素的输入值进行比较数组v。如果x比中间值小 ,搜索重点在表格的下半部分,否则在上半部分上。在任何一种情况下,下一步都是将x与所选一半的中间元素进行比较。 将范围除以2的过程一直持续到找到值或范围为 为空。

为什么当我把int v[4] nexts elements = { 2,3,4,5}for x = 2这个循环永远持续下去?

这是他们的错误?

回答

2

您的代码有错字。 相反

 if(x < v[mid]) 
     high = mid + 1; 

必有

 if(x < v[mid]) 
     high = mid - 1; 

此外,它会更好,如果该函数将被宣布为

int bin(int x, const int v[] , int n); 

因为算法不改变阵列本身可能应用于常量数组。

要考虑到有在头<stdlib.h>

+0

感谢respo。 ,我看到了如果陈述中的错误,但是就像书中的错误 – lotoflaugh 2014-09-21 20:05:18

+0

@lotoflaugh许多书包含错别字。 – 2014-09-21 20:07:39

0

你在程序中进行轻微的错误申报标准的C函数bsearch ...在10行应该是

if(x<v[mid]) 
{ 
    high=mid-1; 
} 

.. 休息是好的...这就是为什么它导致了永久循环