algorithm - COBOL 冒泡排序仅对表的最后一个元素进行排序
问题描述
我目前正在学习 COBOL,并且正在尝试在我的程序中实现冒泡排序算法。虽然我对这门语言还是很陌生,但我所写的内容在语义和句法上对我来说很有意义,但是如果我按顺序输入 5、4、3、2 和 1,我的帖子排序表将变为 1、5, 4, 3, 2. 有人可以向我解释我哪里出错了吗?
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.
解决方案
免责声明:我不是 COBOL 程序员,但我能够通过对循环的这些更改来完成这项工作。
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。然后算法是每次在循环内比较item CNT2和item CNT2+1,而不参考CNT。
此外,不需要每次都在内循环中一直到数组的末尾。我发现在冒泡排序上参考Geeks for Geeks很有帮助
推荐阅读
- python - 将 fillna 值替换为 Dataframe 的第一个非零值
- excel - 使用不同工作表上的单元格设置 Range 对象
- java - 从字符串转换为日期对象不显示预期结果
- powershell - 如何计算 2 个文件夹中的文件并使用 powershell 分隔每个文件夹的总数?
- java - SonarQube + Jacoco 覆盖范围差异
- javascript - 快递中的路由不符合我的预期
- c# - 是否可以在里面查看/编辑 WCF 配置
通过 IIS 管理器中的用户界面在 web.config ASP .Net Web 应用程序中? - windows-10 - Windows 10 S 模式下的驱动程序返回“证书已被其颁发者明确吊销”。
- javascript - 在模式关闭时重置/清除获取的数据
- powershell - Powershell 允许取消启动进程 -wait