COBOL Bubble Sort Сортировка только последнего элемента таблицы - PullRequest
2 голосов
/ 09 февраля 2020

В настоящее время я изучаю COBOL и пытаюсь реализовать алгоритм Bubble Sort в моей программе. Хотя я все еще очень плохо знаком с языком, то, что я написал, имеет смысл для меня семантически и синтаксически, но если я введу 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.

1 Ответ

3 голосов
/ 09 февраля 2020

Отказ от ответственности: я не программист на COBOL, но я смог выполнить эту работу с помощью этих изменений в l oop.

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. Перед внутренним l oop необходимо было каждый раз повторно отправлять CNT2 на 1. А затем алгоритм должен сравнивать элемент CNT2 с элементом CNT2 + 1 в пределах l oop каждый раз без ссылки на CNT.

Кроме того, не было необходимости go до конца массива во внутреннем l oop каждый раз. Я нашел полезным сослаться на Вундеркиндов для вундеркиндов в пузырьковой сортировке

...