10 MV=1000:DIM VA(MV):DIM SK(1024) 20 FI$="INPUT.TXT" 30 OF$="OUTPUT.TXT" 40 PRINT "=======INTROSORT GW-BASIC========" 50 GOSUB 1000 60 GOSUB 8000 70 GOSUB 2000 80 PRINT "==========RUN COMPLETE===========" 90 PRINT USING "INTROSORT TOOK #####.## SECONDS."; EL 100 PRINT "=================================" 110 PRINT "SORT CALLED | TIMES" 120 PRINT "------------+--------------------" 130 PRINT "INTRO |";IT 140 PRINT "INSERTION |";IS 150 PRINT "HEAP |";HP 160 PRINT "=================================" 170 END 1000 REM === LOAD_FILE === 1010 PRINT "READING INPUT FILE..."; 1020 OPEN FI$ FOR INPUT AS #1 1030 IF EOF(1) THEN GOTO 1090 1040 LINE INPUT #1, LN$ 1050 IF LN$="" THEN 1030 1060 VA(CN) = VAL(LN$) 1070 CN = CN + 1 1080 GOTO 1030 1090 CLOSE #1 1100 PRINT "DONE." 1110 RETURN 1999 REM ================= 2000 REM === SAVE_FILE === 2010 PRINT "WRITING OUTPUT FILE..."; 2020 OPEN OF$ FOR OUTPUT AS #1 2030 FOR II = 0 TO CN - 1 2040 PRINT #1, VA(II) 2050 NEXT II 2060 CLOSE #1 2070 PRINT "DONE." 2080 RETURN 2999 REM ================= 3000 REM === SIFT_DOWN === 3010 GOSUB 9020:EX=SV 3020 GOSUB 9020:SX=SV 3030 GOSUB 9020:RX=SV 3040 CX = SX + 2 * (RX - SX) + 1 3050 IF CX >= EX THEN RETURN 3060 IF CX + 1 < EX THEN IF VA(CX) < VA(CX + 1) THEN CX = CX + 1 3070 IF VA(RX) >= VA(CX) THEN RETURN 3080 TP = VA(RX) 3090 VA(RX) = VA(CX) 3100 VA(CX) = TP 3110 RX = CX 3120 GOTO 3040 3130 RETURN 3999 REM ================= 4000 REM === HEAP_SORT === 4010 HP = HP + 1 4020 FOR RU = SX + INT((EX- SX) / 2) - 1 TO SX STEP - 1 4030 SV = RU:GOSUB 9010 4040 SV = SX:GOSUB 9010 4050 SV = EX:GOSUB 9010 4060 GOSUB 3000 4070 NEXT RU 4080 FOR LX = EX - 1 TO SX + 1 STEP - 1 4090 TP = VA(SX) 4100 VA(SX) = VA(LX) 4110 VA(LX) = TP 4120 SV = SX:GOSUB 9010 4130 SV = SX:GOSUB 9010 4140 SV = LX:GOSUB 9010 4150 GOSUB 3000 4160 NEXT LX 4170 RETURN 4999 REM ================= 5000 REM === INSERTION_SORT === 5010 IS = IS + 1 5020 FOR IX = SX TO EX - 1 5030 VU = VA(IX) 5040 PX = IX - 1 5050 IF PX >= SX AND VA(PX) > VU THEN GOTO 5070 5060 GOTO 5100 5070 VA(PX + 1) = VA(PX) 5080 PX = PX - 1 5090 GOTO 5050 5100 VA(PX + 1) = VU 5110 NEXT IX 5120 RETURN 5999 REM ====================== 6000 REM === PARTITION === 6010 GOSUB 9020:EX = SV 6020 GOSUB 9020:SX = SV 6030 LW = SX 6040 RW = EX - 1 6050 PV = VA(SX + (EX - SX) / 2) 6060 IF LW < RW THEN GOTO 6080 6070 GOTO 6190 6080 IF VA(LW) >= PV GOTO 6100 6090 LW = LW + 1:GOTO 6080 6100 IF VA(RW) <= PV GOTO 6120 6110 RW = RW - 1:GOTO 6100 6120 IF LW > RW THEN GOTO 6060 6130 TP = VA(LW) 6140 VA(LW) = VA(RW) 6150 VA(RW) = TP 6160 LW = LW + 1 6170 RW = RW - 1 6180 GOTO 6060 6190 PT = LW 6200 RETURN 6999 REM ================= 7000 REM === INTRO_SORT === 7010 IT = IT + 1 7020 GOSUB 9020:MD = SV 7030 GOSUB 9020:EX = SV 7040 GOSUB 9020:SX = SV 7050 LG = EX - SX 7060 IF LG <= 1 THEN RETURN 7070 IF LG < 16 THEN GOTO 7210 7080 IF MD < 0 THEN GOTO 7220 7090 SV = SX:GOSUB 9010 7100 SV = EX:GOSUB 9010 7110 GOSUB 6000 7120 SV = PT:GOSUB 9010 7130 SV = EX:GOSUB 9010 7140 SV = MD - 1:GOSUB 9010 7150 SV = SX:GOSUB 9010 7160 SV = PT:GOSUB 9010 7170 SV = MD - 1:GOSUB 9010 7180 GOSUB 7000 7190 GOSUB 7000 7200 RETURN 7210 GOSUB 5000:RETURN 7220 GOSUB 4000:RETURN 7999 REM ================== 8000 REM === PERFORM_SORT === 8010 PRINT "SORTING ELEMENTS..."; 8020 LV = CN:GOSUB 9050 8030 MD = LQ * 2 8040 SV = 0:GOSUB 9010 8050 SV = CN:GOSUB 9010 8060 SV = MD:GOSUB 9010 8070 ST = TIMER 8080 GOSUB 7000 8090 ET = TIMER 8100 PRINT "DONE." 8110 EL = ET - ST 8120 IF EL < 0 THEN EL = EL + 86400! 8130 RETURN 8999 REM ==================== 9000 REM === STACK SUBROUTINES === 9010 SK(SP) = SV:SP = SP + 1:RETURN 9020 SP = SP - 1:SV = SK(SP):RETURN 9030 REM ========================= 9050 REM === LOG 2 === 9060 LQ = 0 9070 IF LV <= 1 THEN RETURN 9080 LV = LV / 2 9090 LQ = LQ + 1 9100 GOTO 9070