C #SORTB V1A 12-DEC-72. C LAST UPDATE: C SUBROUTINE SORTB(A,N) DIMENSION A(N) C C *PURPOSE. C TO SORT IN CORE A REAL ARRAY OF ELEMENTS INTO ALGEBRAICALLY C INCREASING ORDER. C C *PARAMETERS: C C A - THE REAL ARRAY OF DIMENSION "N" OR MORE WHOSE FIRST "N" C ELEMENTS WILL BE SORTED. C N - THE LOGICAL LENGTH OF THE VECTOR TO BE SORTED. C C INPUT PARAMETERS: C A, N C OUTPUT PARAMETERS: C A C C *METHOD. C SINGLETON'S METHOD (COMM A.C.M. ALGORITHM 347.) IS USED WITH C SOME TRIVIAL MODIFICATIONS. THIS METHOD IS QUITE EFFICIENT FOR C LARGE ARRAYS AND HAS A MINIMAL STORAGE REQUIREMENT. THE SORT METHOD IS C A MIXTURE OF BINARY AND STRAIGHTFORWARD SORTS. C C *ACCURACY. C C *RESTRICTIONS. C N MUST BE LESS THAN THAN 2**14 (16K) . C C *ERROR CONDITIONS. C C *NONSTANDARD ROUTINES CALLED. C C *TYPICAL TIMES. C DEPEND VERY MUCH ON THE INITIAL ORDER OF THE ARRAY. C C *ORIGIN. R.C.SINGLETON(COMM ACM ALGORITHM 347) VIA M.R.MANNING. C C *COMMENTS. C C #END C C #START. DIMENSION IU(13),IL(13) C M=1 I=1 J=N 5 IF(I.GE.J) GO TO 70 10 K=I IJ=(I+J)/2 T=A(IJ) IF(A(I).LE.T) GO TO 20 A(IJ)=A(I) A(I)=T T=A(IJ) 20 L=J IF(A(J).GE.T) GO TO 40 A(IJ)=A(J) A(J)=T T=A(IJ) IF(A(I).LE.T) GO TO 40 A(IJ)=A(I) A(I)=T T=A(IJ) GO TO 40 30 A(L)=A(K) A(K)=TT 40 L=L-1 IF(A(L).GT.T) GO TO 40 TT=A(L) 50 K=K+1 IF(A(K).LT.T) GO TO 50 IF(K.LE.L) GO TO 30 IF(L-I.LE.J-K) GO TO 60 IL(M)=I IU(M)=L I=K M=M+1 GO TO 80 60 IL(M)=K IU(M)=J J=L M=M+1 GO TO 80 70 M=M-1 IF(M.EQ.0) RETURN I=IL(M) J=IU(M) 80 IF(J-I.GE.11) GO TO 10 IF(I.EQ.IJ) GO TO 5 GO TO 91 90 I=I+1 91 IF(I.EQ.J) GO TO 70 T=A(I+1) IF(A(I).LE.T) GO TO 90 K=I 100 A(K+1)=A(K) K=K-1 IF (T .LT. A(K) ) GO TO 100 A(K+1)= T GO TO 90 C END