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.
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.
Bonjour,
le second AFTER n’est pas accepté par le compilateur.
Cdlt
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