2014-09-21 49 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; 
} 

.. 休息是好的...這就是爲什麼它導致了永久循環