📜  门|门 CS 1996 |第 66 题

📅  最后修改于: 2021-09-26 03:59:21             🧑  作者: Mango

考虑以下程序,该程序尝试使用二分搜索在已排序数组 a[] 中定位元素 x。假设N>1 。程序是错误的。程序在什么情况下会失败?

var i,j,k: integer;  x: integer;
    a: array; [1....N] of integer;
begin    i:= 1; j:= N;
repeat    
    k:(i+j) div 2;
    if a[k] < x then i:= k 
    else j:= k 
until (a[k] = x) or (i >= j);
    
if (a[k] = x) then
    writeln ('x is in the array')
else
    writeln ('x is not in the array')
end;

(A) x 是数组 a[] 的最后一个元素
(B) x 大于数组 a[] 的所有元素
(C)以上两者
(D) x 小于数组 a[] 的最后一个元素答案: (C)
说明:上述程序不适用于要搜索的元素是 a[] 的最后一个元素或大于 a[] 中的最后一个元素(或最大元素)的情况。对于这种情况,程序会进入无限循环,因为在所有迭代中 i 都被赋值为 k,并且 i 永远不会等于或大于 j。所以 while 条件永远不会变成假。
这个问题的测验