使用 Fortran 进行数组问题的二分查找

2024-05-25

我正在使用 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 | 11 23 | 23 49 | 49 55 | 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Fortran 进行数组问题的二分查找 的相关文章

随机推荐

  • FOSUserBundle 强制用户写入不同的密码

    我有一个使用 FOSUSerBundle 在 Symfony2 0 上运行的应用程序 连接该应用程序的用户每 3 个月必须更改一次密码 密码已就位且正在运行 今天 如果用户每 3 个月写入与前一个密码相同的新密码 则无需验证 他还可以使用该
  • Crypt::OpenPGP Symkey 解密失败:无效的密钥 ID

    我遇到问题在哪里地穴 OpenPGP https metacpan org module Crypt 3a 3aOpenPGP无法解密 GPG 编码的消息 看来我是不是第一个 http www perlmonks org node id 9
  • 有条件地隐藏 Gridview 中的 CommandField 或 ButtonField

    我有一个GridView显示人员记录 我想有条件地显示CommandField or ButtonField基于基础记录的某些属性 这个想法是只允许对特定的人执行命令 做这个的最好方式是什么 我更喜欢声明式解决方案而不是过程式解决方案 首先
  • cookie神秘重现的原因是什么?

    我正在开发一个使用 cookie 来存储会话信息的 Web 应用程序 我已经手动删除了会话 cookie 因为我正在处理代码的另一部分 我不需要登录会话 然而 在页面重新加载几次后 会话 cookie 神秘地重新出现 其中包括我之前出于测试
  • Notepad++,比较插件安装问题

    我有 Notepad 7 5 8 npp 7 5 8 它没有插件管理器 以前的版本曾经有过它 我遵循了这些说明 我从下载的https sourceforge net projects npp compare https sourceforg
  • DB2 vs PostgreSQL vs SQL Server [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有人用过这三个数据库吗 你和他们有什么经历 PostgreSQL 对于一个项目来说看起来相当诱人 但我很想了解更多关于它的信息 我们是一家 NE
  • 计算字符串中的单词数

    我需要一些帮助来计算字符串 s 中的单词数 计算字符串 s 中的单词数 单词之间用空格分隔 有溶胶 istringstream iss s string temp int words 0 while iss gt gt temp words
  • ASP.Net MVC 2 - 通过在参数中指示返回操作和控制器来重用控制器/视图

    Problem 在我的应用程序中 我在多个地方为用户提供了一个选择屏幕 即 必须在多个操作中使用相同的选择屏幕 解决方案 我想出了以下解决方案 将返回操作和控制器传递给处理实体选择的操作 Example 假设应用程序中有多个位置 用户必须选
  • System.Web.Cache 和 HTTPContext.Current.Cache 之间的区别

    System Web Cache 和 HTTPContext Current Cache 有什么区别 在什么情况下同时使用两者 System Web Caching Cache 这是 NET 缓存的实现 System Web HttpCon
  • 如何仅隐藏一些未提交的更改?

    我正在对 Git 存储库进行重大更改 并意识到某些更改需要向后移植到错误修复分支 我不想签入我的所有更改master因为它们还没有经过充分的测试和准备 但我确实想提取其中一些更改并将它们提交到错误修复分支 然后按原样返回到 master 我
  • 如何使用 Microsoft Graph API 按分配的计划筛选用户

    我正在尝试下面的请求 按分配计划属性中的 servicePlanId 过滤用户 尝试过滤 电话系统 计划 https graph microsoft com beta users filter assignedPlans any x x s
  • 更新或插入 SQL Server 时忽略错误行

    我的项目必须处理巨大的数据库 在最坏的情况下 它可能是超过8000万行 现在 我有 2 张桌子T1 and T2 我必须从表中复制数据T1到餐桌T2 如果表中的一行T1表中已存在T2 相同主键 然后更新该行其他列的数据T1 to T2 否则
  • 如何使用 vue 观察对象数组中的特定属性

    我正在使用 vue js 2 5 2 我有一个对象数组 我想观察 forms selected 如果它发生变化 则调用一个函数 这是我的尝试 但显然这是不正确的 我尝试将数组放入 for 循环中以观察所选的每个对象的属性 watch for
  • 使用 Google Maps API 旋转 SVG 符号以匹配飞机航向

    我一直在尝试旋转 Google Maps API SVG 飞机符号 以便每次符号移动时都能显示飞机的正确航向 它最初加载时显示正确的标题 我似乎不知道如何将其更新为新标题 我花了两天的时间尝试 但非常失败 我想我可以通过添加来简单地改变它r
  • 是什么导致“线程被中止”异常随机发生并向浏览器显示 HTTP 标头和部分 HTML?

    发生的情况偶尔是随机的 而不是像您期望的那样将 HTML 返回到浏览器 它看起来有点像这样 线程正在中止 HTTP 1 1 200 OK 标题的其余部分 如 HTML 的 1 10 就是这样 他们实际上在浏览器窗口中收到了一堆文本 它不会一
  • 10秒后显示div,10秒后隐藏

    我需要在页面加载后 10 秒内显示一个 div 例如 mybox 使其再保持可见 10 秒 然后以漂亮的滑入 滑出效果隐藏 非常感谢您的任何提示 帮助 请使用以下功能 cycle function cycle myid delay 1000
  • 如何使用 XML 序列化更改 XML 根名称?

    我试图在使用 C 进行 XML 序列化时更改根名称 它始终采用类名称 而不是我试图设置它的名称 using System using System Collections Generic using System Linq using Sy
  • 运行多个 powershell 命令

    我如何运行前导命令 例如set adserversettings当我在 C 中调用 powershell 命令时 现在它返回 0 个结果 这是我正在使用的代码 Command command1 new Command set adserve
  • 为什么没有主键的表是一个坏主意?

    我对数据建模非常陌生 根据微软的实体框架 不允许使用没有主键的表 这显然是一个坏主意 我试图找出为什么这是一个坏主意 以及如何修复我的模型 这样我就不会出现这个漏洞 我当前的模型中有 4 个表 User City HelloCity 和 R
  • 使用 Fortran 进行数组问题的二分查找

    我正在使用 Schaum 的 Fortran 77 编程概要 一书 其中有一个关于使用括号值组方法进行二分搜索的示例 首先这是代码 INTEGER X 100 INTEGER RANGE INTEGER START FINISH PRINT