Arrays 用Fortran实现数组问题中的二进制搜索

Arrays 用Fortran实现数组问题中的二进制搜索,arrays,search,fortran,Arrays,Search,Fortran,我正在使用Schaum的Fortran 77编程大纲,这里有一个关于使用括号组值方法进行二进制搜索的示例。首先,代码如下: INTEGER X(100) INTEGER RANGE INTEGER START , FINISH PRINT *, 'Number of values ?' READ *, N DO 10 I = 1, N READ *, X(I) END DO PRINT *, 'Enter Va

我正在使用Schaum的Fortran 77编程大纲,这里有一个关于使用括号组值方法进行二进制搜索的示例。首先,代码如下:

    INTEGER X(100)
    INTEGER RANGE
    INTEGER START , FINISH

    PRINT *, 'Number of values ?'
    READ *, N
    DO 10 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) .NE. VAL .AND. RANGE .NE. 0)
      IF (VAL .GT. X(MID))THEN
        START = MID 
      ELSE 
        FINISH = MID
      END IF
      RANGE = FINISH - START
      MID = (START + FINISH)/2
    END DO 

    IF( X(MID) .NE. VAL) THEN
      PRINT *, VAL, 'NOT FOUND'
    ELSE
      PRINT *, 'VALUE AT' , MID
    END IF
    END
问题是,当我输入7个值数组时

2 | 9 | 11 | 23 | 49 | 55 | 66

并搜索66例如,当

MID=5

,下一个循环的新MID变为6。但是当它为6时,它不能为下一个循环递增,因为

中间=(开始+结束)/2=(6+7)/2=6

当然应该是7号

它还在6号。当然,我的程序从不给我输出。
我在这里该怎么办

这只是一个输入错误,或者可能有人在从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

请注意,二进制搜索并不总是比线性搜索快,即使您真的期望它会快。好的,谢谢。我来看看。小问题是这比np.where之类的东西快。我正在使用f2py寻找替代方法。该算法访问下限if val下面的数组“x”