2017-08-27 31 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

试试这个:

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