SUBROUTINE SPN(K, L, II, JJ, MIN) SPN 10 C **SAMPLE SEARCH SORT** C A LIST INSERTION SORT TO BUILD UP A SINGLE CIRCULARLY C LINKED LIST. C THIS ALGORITHM SORTS THE KEYS K(II),K(II+1),...,K(JJ) IN C ASCENDING SORTING ORDER BY THE MEANS OF THE POINTER FIELDS C L(II),L(II+1),....,L(JJ). C THE EXPECTED NUMBER OF NECESSARY COMPARISIONS AND C ACCESSES IS OF ORDER N**1.5 (N=JJ-II+1). C WITH SINGLE KEYS THE ALGORITHM IS PROPORTIONAL IN SORTING C TIME TO A SHELL SORT ALGORITHM. C ISTRT AUXILIARY VARIABLE IN RANDOM SEARCH C K ARRAY OF N KEYS. C L ARRAY FOR N POINTERS. C IPOI VARIABLE WHICH IS USED TO MANIPULATE POINTERS. C KDIFF DISTANCE OF THE KEY FOUND IN RANDOM SEARCH C AND THE KEY WHICH SHALL BE INSERTED. C KEY,MADIN ADDRESSES USED IN SEQUENTIAL AND RANDOM SEARCH. C MAX,MIN VARIABLES TO STORE THE ADDRESS OF THE C KEYS WITH THE SMALLEST AND LARGEST VALUE. C N NUMBER OF KEYS. C IRT STEP WIDTH IN RANDOM SEARCH. C TAB ARRAY OF VALUES WHICH DETERMINES THE SAMPLE SIZE. C THE ALGORITHM IS STABLE. C MIN RETURNS THE ADDRESS OF THE FIRST RECORD IN SORTING C ORDER OF THE LIST. INTEGER TAB(57) DIMENSION K(1), L(1) DATA TAB(1), TAB(2), TAB(3), TAB(4), TAB(5), TAB(6), TAB(7), * TAB(8), TAB(9), TAB(10), TAB(11), TAB(12), TAB(13), TAB(14), * TAB(15), TAB(16), TAB(17), TAB(18), TAB(19), TAB(20), * TAB(21), TAB(22), TAB(23), TAB(24), TAB(25), TAB(26), * TAB(27), TAB(28), TAB(29), TAB(30), TAB(31), TAB(32), * TAB(33), TAB(34), TAB(35), TAB(36), TAB(37), TAB(38), * TAB(39), TAB(40), TAB(41), TAB(42), TAB(43), TAB(44), * TAB(45), TAB(46), TAB(47), TAB(48), TAB(49), TAB(50), * TAB(51), TAB(52), TAB(53), TAB(54), TAB(55), TAB(56), * TAB(57) /3,5,10,17,26,37,50,65,82,101,122,145,170,197,226, * 257,290,325,362,401,442,485,530,577,626,677,730,785,842,901, * 962,1025,1090,1157,1226,1297,1370,1445,1522,1601,1682,1765, * 1850,1937,2026,2117,2210,2305,2402,2501,2602,2705,2810,2917, * 3026,3137,3250/ C INITIALISATION (PART I) C ----------------------------------------------------------- MIN = II MAX = II L(II) = II IF (JJ-II) 170, 170, 10 10 KMIN = K(MIN) KMAX = KMIN IA = II + 1 IRT = 1 ITAB = TAB(1) + II - 1 ISTRT = II C ----------------------------------------------------------- C INSERTION LOOP (PART II) DO 160 J=IA,JJ C CORRECTION OF THE SAMPLE SIZE (IF NECESSARY) IF (J-ITAB) 30, 20, 20 C ----------------------------------------------------------- 20 IRT = IRT + 1 ISTRT = ISTRT + 1 ITAB = TAB(IRT) + II - 1 C ----------------------------------------------------------- 30 KJ = K(J) C PROVISION FOR ARISING LARGEST AND SMALLEST KEYS (1). IF (KJ-KMAX) 40, 60, 60 C ----------------------------------------------------------- 40 IF (KJ-KMIN) 70, 50, 90 C ----------------------------------------------------------- C KEY WHICH SHALL BE INSERTED IS EQUAL TO THE MINIMAL C KEY SORTED SO FAR (2). C ----------------------------------------------------------- 50 MADIN = MIN MIN = J GO TO 130 C ----------------------------------------------------------- C KEY WHICH SHALL BE INSERTED IS EQUAL TO OR LARGER THAN THE C MAXIMAL KEY SORTED SO FAR (3). C ----------------------------------------------------------- 60 I = MAX MAX = J KMAX = K(J) GO TO 80 C ----------------------------------------------------------- C KEY FOR INSERTION IS SMALLER THAN THE SMALLEST KEY SORTED C SO FAR (4). C ----------------------------------------------------------- 70 I = MAX MIN = J KMIN = K(J) C ----------------------------------------------------------- C INSERTION OF THE RECORD AND CORRECTION OF THE VALUE WHICH C DETERMINES THE SAMPLE SIZE (5). C ----------------------------------------------------------- 80 IPOI = L(I) L(I) = J L(J) = IPOI GO TO 160 C ----------------------------------------------------------- C INITIALISATION FOR RANDOM SEARCH (FIRST STEP) (6). C ----------------------------------------------------------- 90 MADIN = MIN IPOI = J - 1 I = KJ - KMIN C ----------------------------------------------------------- C RANDOM SEARCH (7). C PART 1 (7A). C ----------------------------------------------------------- DO 120 KEY=ISTRT,IPOI,IRT KDIFF = KJ - K(KEY) IF (KDIFF) 120, 140, 100 C ----------------------------------------------------------- 100 IF (I-KDIFF) 120, 120, 110 C ----------------------------------------------------------- C PART 2.. STORE NEAREST KEY FOUND SO FAR (7B) C ----------------------------------------------------------- 110 I = KDIFF MADIN = KEY C ----------------------------------------------------------- 120 CONTINUE C ----------------------------------------------------------- C SEQUENTIAL SEARCH (8). C ----------------------------------------------------------- 130 IPOI = MADIN MADIN = L(IPOI) IF (KJ-K(MADIN)) 150, 130, 130 C ----------------------------------------------------------- C KEY SEARCHED FOR WAS FOUND IN RANDOM SEARCH C ----------------------------------------------------------- 140 MADIN = KEY GO TO 130 C ----------------------------------------------------------- C INSERT (9) C ----------------------------------------------------------- 150 L(IPOI) = J L(J) = MADIN C ----------------------------------------------------------- 160 CONTINUE C ----------------------------------------------------------- 170 MIN = L(MAX) L(MAX) = 0 RETURN END .