考虑以下程序,该程序尝试使用二分搜索在已排序数组 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 条件永远不会变成假。
这个问题的测验