subroutine sort(a, n) c c -- nonrecursive quick sort for vector a c -- figure 6.7 c integer n, i, j, sp, mid, left(20), right(20) real a(1), pivot c left(1) = 1 right(1) = n sp = 1 10 if (left(sp) .lt. right(sp)) goto 20 sp = sp - 1 goto 130 20 i = left(sp) j = right(sp) pivot = a(j) mid = (i + j) / 2 if (j - i .lt. 6) goto 50 if ((pivot .gt. a(i)).and.(pivot .lt. a(mid))) goto 50 if ((pivot .lt. a(i)).and.(pivot .gt. a(mid))) goto 50 if ((a(i) .lt. a(mid)).and.(a(i) .gt. pivot)) goto 30 if ((a(i) .gt. a(mid)).and.(a(i) .lt. pivot)) goto 30 call swap(a(mid), a(j)) goto 40 30 call swap(a(i), a(j)) 40 pivot = a(j) 50 if (i .ge. j) goto 110 60 if (a(i) .ge. pivot) goto 70 i = i + 1 goto 60 70 j = j - 1 80 if (.not.((i .lt. j) .and. (pivot .lt. a(j)))) goto 90 j = j - 1 goto 80 90 if (i .lt. j) call swap(a(i), a(j)) 100 goto 50 110 j = right(sp) call swap(a(i), a(j)) if ((i - left(sp)) .ge. (right(sp) - i)) goto 120 c -- stack shorter first left(sp+1) = left(sp) right(sp+1) = i - 1 left(sp) = i + 1 goto 125 120 left(sp+1) = i + 1 right(sp+1) = right(sp) right(sp) = i - 1 125 sp = sp + 1 130 if (sp .gt. 0) goto 10 return end