5 ! HASHB- BULID HASH FILE 6 !****WRITTEN BY R BRANTON ::: NOV 14,1972 10 OPEN "**MASTER" AS FILE 1 : DIM# 1 ,M%(100) 15 OPEN "**SCLINF" AS FILE 2 : DIM# 2 ,C$( 2222 )=16 20 OPEN "**HASH" AS FILE 7 : DIM# 7 ,H( 2222 ,3),Z%(100,2) 25 OPEN "**STATUS" AS FILE 4 : DIM# 4 ,E9%( 2222 ,2) 30 R9$=" ##### ######## ######## #####" 50 DEF FNA(Z)=Z-INT(Z/10)*10 60 DIM D%(1500%) 110 Z%(I%,J%)=0% FOR J%=1 TO 2 FOR I%=1 TO 100 200 H(0%,0%)=M%(1%) : N=M%(1%) 205 H(I%,J%)=0 FOR J%=1% TO 3% FOR I%=1 TO N 210 FOR I=1 TO N 220 B$=LEFT(C$(I),10) 230 C9=0 : C8=0 : CHANGE B$ TO A 249 FOR I%=1 TO 4 250 IF A(I%)<>0 AND A(I%)<>32 THEN C9=C9*10+FNA(A(I%)) 251 NEXT I% 299 FOR I%=5 TO 10 300 IF A(I%)<>0 AND A(I%)<>32 THEN C8=C8*10+FNA(A(I%)) 301 NEXT I% 400 H(I,1)=C9 : H(I,2)=C8 : H(I,3)=I 500 NEXT I 1000 ! ******** SORT HASH NUMBERS ********** 1004 PRINT "SORT STARTED AT ";TIME$(0) 1005 M=N 1010 M=INT(M/2) 1030 IF M=0 THEN 1520 1040 K=N-M 1050 FOR J=1 TO K 1060 FOR I=J TO 1 STEP -M 1070 IF H(I+M,1) > H(I,1) THEN 1200 1080 IF H(I+M,1) = H(I,1) THEN IF H(I+M,2) >= H(I,2) THEN 1200 1090 FOR J%=1% TO 3% 1100 Z=H(I,J%) 1110 H(I,J%)=H(I+M,J%) 1120 H(I+M,J%)=Z 1130 NEXT J% 1150 NEXT I 1200 NEXT J 1350 PRINT M 1400 GOTO 1010 ! GO MAKE NEXT PASS 1520 PRINT "SORT FINISHED AT";TIME$(0) 1600 ! ******** SET UP FILE INDEXES ********** 1620 K%=INT(H(1,1)/10^2) 1630 Z1%=K% : Z%(Z1%,1)=1% 1640 FOR I=2 TO N 1650 K1%=INT(H(I,1)/10^2) 1660 IF K%=K1% THEN 1800 ! SAME GROUP 1670 Z%(Z1%,2)=I-1 : Z1%=K1% 1680 Z%(Z1%,1)=I : K%=K1% 1800 NEXT I 1810 Z%(Z1%,2)=N 2010 OPEN "LP:" AS FILE 12 2020 PRINT #12,I;TAB(5);Z%(I,1);TAB(12);Z%(I,2) FOR I=0 TO 99 2030 PRINT #12,"*********************************************" 2040 FOR I=1 TO N 2041 PRINT #12,LEFT(C$(H(I,3)),10); 2045 PRINT #12USING R9$,H(I,3),H(I,1),H(I,2),I 2046 IF H(I,1)<>H(I+1,1) THEN 2049 2047 IF H(I,2)<>H(I+1,2) THEN 2049 2048 PRINT "::: DUP HASH# ": PRINT LEFT(C$(H(I,3)),10);H(I,3) : PRINT LEFT(C$(H(I+1,3)),10);H(I+1,3) 2049 NEXT I 3000 ! ***** SORT CLASSES IN ALPHA ORDER ***** 3010 D%(I%)=I% FOR I%=1% TO N 3020 M=N 3100 M=INT(M/2) : K=N-M 3200 FOR I%=1% TO K 3210 IF C$(D%(I%)) <= C$(D%(I%+M)) THEN 3500% 3220 D1%=D%(I%) : D%(I%)=D%(I%+M) : D%(I%+M)=D1% 3300 FOR J%=I% TO 1% STEP -M 3310 IF J%-M < 1 THEN 3500% 3320 IF C$(D%(J%)) >= C$(D%(J%-M)) THEN 3500% 3330 D1%=D%(J%) : D%(J%)=D%(J%-M) : D%(J%-M)=D1% 3400 NEXT J% 3500 NEXT I% 3600 IF M >= 2 THEN 3100 ! GO MAKE ANOTHER PASS 3700 & #12,CHR$(12) : & #12 : & #12 : & #12,TAB(40);DATE$(0);" ";TIME$(0) 3710 & #12 : & #12,TAB(30);"CLASSES IN SORT ORDER" : & #12 3720 & #12,"INDEX CLASS" : & #12,"---- ---------------" 3730 M%(93%)=D%(1%) ! SET FIRST POINTER 3790 & #12,D%(1);TAB(7);C$(D%(1)) 3800 FOR I%=1% TO N-1 3810 E9%(D%(I%),2%)=D%(I%+1%) ! SET NEXT FLAG 3820 & #12,D%(I%+1%);TAB(7);C$(D%(I%+1%)) 3850 NEXT I% 9000 CLOSE 1,2,4,7,12 9999 END