2017-08-27 50 views
1

我一直在嘗試過去的一小時,以獲得此二進制搜索算法的工作,並通過使用可汗學院解釋算法的一個例子,我仍然無法工作,它應該輸出一個數字,但沒有任何反應。上汗學院的示例是這樣的:試圖實現二進制搜索算法,似乎無法使其工作

  1. 讓分鐘= 0和max = n-1個。
  2. 如果最大值爲<分鐘,則停止:目標不在陣列中。返回-1。
  3. 計算最大值和最小值的平均值,向下舍入(使其爲整數)。
  4. 如果array [guess]等於target,則停止。你找到了!返回猜測。
  5. 如果猜測值太低,就是數組[猜測] <的目標,那麼設置min = guess + 1.
  6. 否則,猜測值太高。設置最大=猜測 - 1
  7. 回到步驟2

和代碼我寫根據步驟是:

#include <iostream> 
int main() { 
int arr[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 }; 
int min = 0; 
int max = 24; 
int guess; 
int targetValue = 73; 
while (max > min) { 
    guess = ((max + min)/2); 
    if (arr[guess] == targetValue) { 
     std::cout << guess; 
     break; 
    } 
    else if (arr[guess] < targetValue) { 
     min = guess + 1; 
    } 
    else { 
     max = guess - 1; 
    } 
} 
return 0; 
} 
+1

正如此言,你應該寫'的std ::法院<<猜<<的std :: endl',以便輸出緩衝區被刷新。 – ypnos

+0

@ypnos指出,謝謝。 – JAin

+1

將'std :: cout << min <<「」<< max << std :: endl;'作爲'while循環的第一行並且它會幫助你診斷..你會看到這個程序現在暫停在最小=最大= 20處' – quetzalcoatl

回答

2

二進制搜索算法狀態

如果L> R,則搜索終止爲不成功。

在您的實現然而,你終止條件L> = R的搜索中,L的情況下== R,該算法應該做一個多次迭代,因爲它沒有考慮列表這個位置然而。

對於目標值爲73的情況,算法達到目標位置20時,L == R.您的實現過早終止一個步驟來識別目標。

1

試試這個:

(最大值>分鐘)至(最大值> =分鐘)