Sorting algorithms/Bubble sort: Difference between revisions

Content added Content deleted
(Add BBC Basic and Cobol versions of bubble sort)
Line 201: Line 201:
END IF
END IF
LOOP WHILE(NOT changed)</lang>
LOOP WHILE(NOT changed)</lang>

=={{header|BBC Basic}}==
The Bubble sort is very inefficient for 99% of cases. This subroutine uses a couple of 'tricks' to try and mitigate the inefficiency to a limited extent.
<lang bbcbasic>DEF PROC_BubbleSort(Size%)

I%=Size%+1
REPEAT
I%-=1
LastChange%=2
FOR J% = 2 TO I%
IF data%(J%-1) > data%(J%) THEN
SWAP data%(J%-1),data%(J%)
LastChange%=J%
ENDIF
NEXT J%
I%=LastChange%
UNTIL I% = 2

ENDPROC</lang>


=={{header|C}}==
=={{header|C}}==
Line 400: Line 419:
(println (bubble-sort [10 9 8 7 6 5 4 3 2 1]))</lang>
(println (bubble-sort [10 9 8 7 6 5 4 3 2 1]))</lang>

=={{header|Cobol}}==
This is a complete program that reads in a file of integers and sorts them.
<lang cobol> IDENTIFICATION DIVISION.
PROGRAM-ID. BUBBLESORT.
AUTHOR. DAVE STRATFORD.
DATE-WRITTEN. MARCH 2010.
INSTALLATION. HEXAGON SYSTEMS LIMITED.

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. ICL VME.
OBJECT-COMPUTER. ICL VME.

INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FA-INPUT-FILE ASSIGN FL01.
SELECT FB-OUTPUT-FILE ASSIGN FL02.

DATA DIVISION.
FILE SECTION.

FD FA-INPUT-FILE.
01 FA-INPUT-REC.
03 FA-DATA PIC S9(6).

FD FB-OUTPUT-FILE.
01 FB-OUTPUT-REC PIC S9(6).

WORKING-STORAGE SECTION.
01 WA-IDENTITY.
03 WA-PROGNAME PIC X(10) VALUE "BUBBLESORT".
03 WA-VERSION PIC X(6) VALUE "000001".

01 WB-TABLE.
03 WB-ENTRY PIC 9(8) COMP SYNC OCCURS 100000
INDEXED BY WB-IX-1.

01 WC-VARS.
03 WC-SIZE PIC S9(8) COMP SYNC.
03 WC-TEMP PIC S9(8) COMP SYNC.
03 WC-END PIC S9(8) COMP SYNC.
03 WC-LAST-CHANGE PIC S9(8) COMP SYNC.

01 WF-CONDITION-FLAGS.
03 WF-EOF-FLAG PIC X.
88 END-OF-FILE VALUE "Y".
03 WF-EMPTY-FILE-FLAG PIC X.
88 EMPTY-FILE VALUE "Y".

PROCEDURE DIVISION.
A-MAIN SECTION.
A-000.
PERFORM B-INITIALISE.
IF NOT EMPTY-FILE
PERFORM C-SORT.
PERFORM D-FINISH.

A-999.
STOP RUN.

B-INITIALISE SECTION.
B-000.
DISPLAY "*** " WA-PROGNAME " VERSION "
WA-VERSION " STARTING ***".

MOVE ALL "N" TO WF-CONDITION-FLAGS.
OPEN INPUT FA-INPUT-FILE.
SET WB-IX-1 TO 0.

READ FA-INPUT-FILE AT END MOVE "Y" TO WF-EOF-FLAG
WF-EMPTY-FILE-FLAG.

PERFORM BA-READ-INPUT UNTIL END-OF-FILE.

CLOSE FA-INPUT-FILE.

SET WC-SIZE TO WB-IX-1.

B-999.
EXIT.

BA-READ-INPUT SECTION.
BA-000.
SET WB-IX-1 UP BY 1.
MOVE FA-DATA TO WB-ENTRY(WB-IX-1).

READ FA-INPUT-FILE AT END MOVE "Y" TO WF-EOF-FLAG.

BA-999.
EXIT.

C-SORT SECTION.
C-000.
DISPLAY "SORT STARTING".

MOVE WC-SIZE TO WC-END.
PERFORM E-BUBBLE UNTIL WC-END = 1.

DISPLAY "SORT FINISHED".

C-999.
EXIT.

D-FINISH SECTION.
D-000.
OPEN OUTPUT FB-OUTPUT-FILE.
SET WB-IX-1 TO 1.

PERFORM DA-WRITE-OUTPUT UNTIL WB-IX-1 > WC-SIZE.

CLOSE FB-OUTPUT-FILE.

DISPLAY "*** " WA-PROGNAME " FINISHED ***".

D-999.
EXIT.

DA-WRITE-OUTPUT SECTION.
DA-000.
WRITE FB-OUTPUT-REC FROM WB-ENTRY(WB-IX-1).
SET WB-IX-1 UP BY 1.

DA-999.
EXIT.

E-BUBBLE SECTION.
E-000.
MOVE 1 TO WC-LAST-CHANGE.

PERFORM F-PASS VARYING WB-IX-1 FROM 1 BY 1
UNTIL WB-IX-1 = WC-END.

MOVE WC-LAST-CHANGE TO WC-END.

E-999.
EXIT.

F-PASS SECTION.
F-000.
IF WB-ENTRY(WB-IX-1) > WB-ENTRY(WB-IX-1 + 1)
SET WC-LAST-CHANGE TO WB-IX-1
MOVE WB-ENTRY(WB-IX-1) TO WC-TEMP
MOVE WB-ENTRY(WB-IX-1 + 1) TO WB-ENTRY(WB-IX-1)
MOVE WC-TEMP TO WB-ENTRY(WB-IX-1 + 1).

F-999.
EXIT.</lang>


=={{header|Common Lisp}}==
=={{header|Common Lisp}}==