这只是一个拼写错误,或者也许有人在从 C 版本翻译它时感到困惑,并且不得不更改索引。
循环中的关键不变量是,如果该值在列表中,则该值必须落在数组中从索引开始到结束(包括索引)的某个位置。但是一旦你排除了mid,它就应该从列表中删除。但它不在这里,所以列表总是太长,您会遇到您所看到的问题。
正确的版本将开始设置为 mid+1,或将结束设置为 mid-1,以排除 mid。更正后的代码,以 Fortran 90 风格编写:
program binarysearch
implicit none
integer, allocatable, dimension(:) :: x
integer :: range, start, finish, mid
integer :: i, n, val
print *, 'Number of values ?'
read *, N
allocate( x(N) )
do i = 1, n
READ *, x(i)
end do
print *, 'Enter Value'
read *, VAL
start = 1
finish = N
range = finish - start
mid = (start + finish) /2
do while( x(mid) /= val .and. range > 0)
if (val > x(mid)) then
start = mid + 1
else
finish = mid - 1
end if
range = finish - start
mid = (start + finish)/2
end do
if( x(mid) /= val) then
print *, val, 'NOT FOUND'
else
print *, 'VALUE AT' , mid
end if
deallocate( x )
end program binarysearch