首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >COBOL气泡排序仅对表的最后一个元素排序

COBOL气泡排序仅对表的最后一个元素排序
EN

Stack Overflow用户
提问于 2020-02-09 10:01:06
回答 1查看 464关注 0票数 2

我目前正在学习COBOL,并且正在尝试在我的程序中实现冒泡排序算法。虽然我对这门语言还很陌生,但我写的东西在语义和语法上对我来说是有意义的,但是如果我按这个顺序输入5,4,3,2和1,我的帖子排序表就变成了1,5,4,3,2。有人能解释一下我哪里错了吗?

代码语言:javascript
运行
复制
       IDENTIFICATION DIVISION.
         PROGRAM-ID. BubbleSort.

       DATA DIVISION.
         WORKING-STORAGE SECTION.
         01 TVAR PIC 9(4).
         01 CNT PIC 9(1) VALUE 1.
         01 CNT2 PIC 9(1) VALUE 1.
         01 ARR.
            05 ARRELEMENT PIC 9(4) OCCURS 5 TIMES.
         01 TABLELENGTH PIC 9(1) VALUE 5.

       PROCEDURE DIVISION.
         DISPLAY "Enter 5 numbers: ".
         PERFORM INPUT-PARA VARYING CNT FROM 1 BY 1 UNTIL CNT>5.

         DISPLAY "Pre Bubble-Sort: ".
         PERFORM PRINT-PARA VARYING CNT FROM 1 BY 1 UNTIL CNT>5.

         PERFORM BBLSORT-PARA.

         DISPLAY "Post Bubble-Sort: ".
         PERFORM PRINT-PARA VARYING CNT FROM 1 BY 1 UNTIL CNT>5.

         STOP RUN.

         INPUT-PARA.
            ACCEPT ARRELEMENT(CNT).

         PRINT-PARA.
            DISPLAY "Table element: "ARRELEMENT(CNT).

         BBLSORT-PARA.
             INITIALIZE CNT CNT2.
             MOVE 1 TO CNT.
             MOVE 2 TO CNT2.
             PERFORM UNTIL CNT>6
               PERFORM UNTIL CNT2>5
               DISPLAY "IF "ARRELEMENT(CNT) " IS > "ARRELEMENT(CNT2)
                 IF (ARRELEMENT((CNT)) > ARRELEMENT((CNT2)))
                 THEN
                   DISPLAY ARRELEMENT(CNT) " IS > "ARRELEMENT(CNT2)
                    MOVE ARRELEMENT(CNT) TO TVAR
                    MOVE ARRELEMENT(CNT2) TO ARRELEMENT(CNT)
                    MOVE TVAR TO ARRELEMENT(CNT2)
                 END-IF
                 DISPLAY "EXIT IF LOOP"
                 ADD 1 TO CNT2 GIVING CNT2
               END-PERFORM
               ADD 1 TO CNT GIVING CNT
             END-PERFORM.

       END PROGRAM BubbleSort.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-09 11:04:56

免责声明:我不是COBOL程序员,但通过对循环的这些更改,我能够做到这一点。

代码语言:javascript
运行
复制
PERFORM VARYING CNT
           FROM 1 BY 1
          UNTIL CNT > 4

   PERFORM VARYING CNT2
              FROM 1 BY 1
             UNTIL CNT2 + CNT > 5

      COMPUTE
         CNT3 = CNT2 + 1
      END-COMPUTE

      IF (ARRELEMENT((CNT2)) > ARRELEMENT((CNT3)))
         DISPLAY ARRELEMENT(CNT2) " IS > "ARRELEMENT(CNT3)
         MOVE ARRELEMENT(CNT3) TO TVAR
         MOVE ARRELEMENT(CNT2) TO ARRELEMENT(CNT3)
         MOVE TVAR TO ARRELEMENT(CNT2)
      END-IF

      DISPLAY "EXIT IF LOOP"
   END-PERFORM
END-PERFORM.

关键是添加一个CNT3,我用它来代表CNT2 + 1。在内部循环之前,每次都需要将CNT2重新发送到1。然后,该算法在每次不引用CNT的情况下,在循环内比较项CNT2与项CNT2+1。

而且,不需要每次都在内部循环中一直走到数组的末尾。我发现参考Geeks for Geeks on bubble sort很有帮助。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60132893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档