97 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Fortran
		
	
	
	
	
	
		
		
			
		
	
	
			97 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Fortran
		
	
	
	
	
	
|   | subroutine sort(n,arr)
 | ||
|  | 
 | ||
|  |   integer n,m,nstack
 | ||
|  |   real arr(n)
 | ||
|  |   parameter (m=7,nstack=50)
 | ||
|  |   integer i,ir,j,jstack,k,l,istack(nstack)
 | ||
|  |   real a,temp
 | ||
|  | 
 | ||
|  |   jstack=0
 | ||
|  |   l=1
 | ||
|  |   ir=n
 | ||
|  |   n0=n
 | ||
|  | 
 | ||
|  | 1 if(ir-l.lt.m) then
 | ||
|  |      do j=l+1,ir
 | ||
|  |         a=arr(j)
 | ||
|  |         do i=j-1,1,-1
 | ||
|  |            if(arr(i).le.a) goto 2
 | ||
|  |            arr(i+1)=arr(i)
 | ||
|  |         enddo
 | ||
|  |         i=0
 | ||
|  | 2       arr(i+1)=a
 | ||
|  |      enddo
 | ||
|  | 
 | ||
|  |      if(jstack.eq.0) return
 | ||
|  | 
 | ||
|  |      ir=istack(jstack)
 | ||
|  |      l=istack(jstack-1)
 | ||
|  |      jstack=jstack-2
 | ||
|  | 
 | ||
|  |   else
 | ||
|  |      k=(l+ir)/2
 | ||
|  |      temp=arr(k)
 | ||
|  |      arr(k)=arr(l+1)
 | ||
|  |      arr(l+1)=temp
 | ||
|  | 
 | ||
|  |      if(arr(l+1).gt.arr(ir)) then
 | ||
|  |         temp=arr(l+1)
 | ||
|  |         arr(l+1)=arr(ir)
 | ||
|  |         arr(ir)=temp
 | ||
|  |      endif
 | ||
|  | 
 | ||
|  |      if(arr(l).gt.arr(ir)) then
 | ||
|  |         temp=arr(l)
 | ||
|  |         arr(l)=arr(ir)
 | ||
|  |         arr(ir)=temp
 | ||
|  |      endif
 | ||
|  | 
 | ||
|  |      if(arr(l+1).gt.arr(l)) then
 | ||
|  |         temp=arr(l+1)
 | ||
|  |         arr(l+1)=arr(l)
 | ||
|  |         arr(l)=temp
 | ||
|  |      endif
 | ||
|  | 
 | ||
|  |      i=l+1
 | ||
|  |      j=ir
 | ||
|  |      a=arr(l)
 | ||
|  | 3    i=i+1
 | ||
|  |      if(i.gt.n0) then
 | ||
|  |         do jj=1,n0
 | ||
|  |            write(99,3001) jj,arr(jj),i,n,ir
 | ||
|  | 3001       format(i10,e12.3,3i10)
 | ||
|  |         enddo
 | ||
|  |         close(99)
 | ||
|  |         stop 'Bounds error in sort.f90'
 | ||
|  |      endif
 | ||
|  |      if(arr(i).lt.a) goto 3
 | ||
|  | 
 | ||
|  | 4    j=j-1
 | ||
|  |      if(arr(j).gt.a) goto 4
 | ||
|  | 
 | ||
|  |      if(j.lt.i) goto 5
 | ||
|  |      temp=arr(i)
 | ||
|  |      arr(i)=arr(j)
 | ||
|  |      arr(j)=temp
 | ||
|  |      goto 3
 | ||
|  | 
 | ||
|  | 5    arr(l)=arr(j)
 | ||
|  |      arr(j)=a
 | ||
|  |      jstack=jstack+2
 | ||
|  |      if(jstack.gt.nstack) stop 'nstack too small in sort'
 | ||
|  | 
 | ||
|  |      if(ir-i+1.ge.j-l) then
 | ||
|  |         istack(jstack)=ir
 | ||
|  |         istack(jstack-1)=i
 | ||
|  |         ir=j-1
 | ||
|  |      else
 | ||
|  |         istack(jstack)=j-1
 | ||
|  |         istack(jstack-1)=l
 | ||
|  |         l=i
 | ||
|  |      endif
 | ||
|  | 
 | ||
|  |   endif
 | ||
|  |   goto 1
 | ||
|  | 
 | ||
|  | end subroutine sort
 |