Implémentation de l’algorithme de tri à bulles en COBOL

Un des algorithmes de tri les plus simples à appréhender est celui du tri à bulles. Il consiste à balayer la liste autant de fois qu’il y a d’éléments, et à chaque passage de faire remonter en fin de liste les plus grands éléments détectés. C’est également l’algorithme le plus lent.

Explication animée du fonctionnement de l'algorithme de tri à bulles
Fonctionnement de l’algorithme de tri à bulles

Je vous propose une implémentation qui comporte des exemples d’utilisation des instructions COBOL suivantes :

  • Tableaux à taille dynamique : OCCURS … DEPENDING ON…
  • Double boucle imbriquée faisant varier deux indices : PERFORM VARYING …
      ******************************************************************
      * Component : BBUBSORT (COBOL batch)
      * Author : Cyril Coquilleau
      * Date : 2018-04-14
      * Purpose : Implements bubble sort algorithm
      ******************************************************************
       IDENTIFICATION DIVISION.
       PROGRAM-ID. BBUBSORT.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
      *Array definition
       01 ARRAY-GROUP.
           03 ARRAY-SIZE      PIC 9(9) VALUE 100.
           03 ELT-ARRAY OCCURS 0 TO 9999999 DEPENDING ON ARRAY-SIZE.
              05 ELT-VALUE     PIC 9(8).

      *Indexes
       01 NUM             PIC 9(9).
       01 I               PIC 9(9).
       01 J               PIC 9(9).

      *Temporary data for swapping
       01 ELT-VALUE-TEMP  PIC 9(8).


       PROCEDURE DIVISION.

       MAIN-PROCEDURE.
           DISPLAY 'DATA BEFORE BUBBLE SORT'
           PERFORM VARYING NUM FROM 1 BY 1 UNTIL NUM > ARRAY-SIZE
             COMPUTE ELT-VALUE(NUM) = 1 + FUNCTION RANDOM * 10000000 
             DISPLAY ELT-VALUE(NUM)          
           END-PERFORM
       
      *    Sorting the array with Bubble Sort algorithm
           PERFORM VARYING I FROM ARRAY-SIZE BY -1 UNTIL I = 1
             PERFORM VARYING J FROM 1 BY 1 UNTIL J = I
           
      *        Swapping if needed 
               IF ELT-VALUE(J + 1) < ELT-VALUE(J)
                  MOVE ELT-VALUE(J + 1) TO ELT-VALUE-TEMP
                  MOVE ELT-VALUE(J)       TO ELT-VALUE(J + 1)
                  MOVE ELT-VALUE-TEMP     TO ELT-VALUE(J)
               END-IF
            END-PERFORM
          END-PERFORM

          DISPLAY 'DATA AFTER BUBBLE SORT'
          PERFORM VARYING NUM FROM 1 BY 1 UNTIL NUM > ARRAY-SIZE
             DISPLAY ELT-VALUE(NUM)          
          END-PERFORM            
            
          GOBACK
          .
       END PROGRAM BBUBSORT.

Nota : l’utilisation du PERFORM VARYING … AFTER … afin d’effectuer une double boucle imbriquée est possible sur certains compilateurs, mais tend à être de moins en moins acceptée sur les versions des compilateurs les plus récentes.

Publié le
Catégorisé comme Non classé

2 commentaires

    1. Bonjour,
      En effet le AFTER ne semble pas être accepté sur certaines versions récentes de compilateurs. Quel compilateur utilisez-vous ?
      J’ai mis le programme à jour afin qu’il effectue la double boucle imbriquée à l’aide de deux PERFORM (et quelques petites optimisations supplémentaires au passage).
      Bien à vous

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.