! Metodos Numericos y Simulaciones en Astrofisica
! FCEFN - UNSJ, 2010
!
! ejemplo 3
!
! Ordenamiento de arrays - Metodo de insercion
!
!
program eje3
implicit none
  integer, parameter ::d=selected_real_kind(16,200)
  integer :: ii
  real(d), dimension(50) :: ori,dat
  real(d) :: val

! inicializa generador de numeros aleatorios
!
  call random_seed()

! arma un array de numeros reales al azar
!
  do ii=1,50
    call random_number(val)
    dat(ii)=float(int(10000._d*val))/10._d
  enddo

! guarda el array original
!
  ori=dat

! lo ordena usando insercion
!
  call insert(50,dat)

! salida a pantalla
!
  write(*,*)'Array original: '
  write(*,*)ori
  write(*,*)' '
  write(*,*)'Array ordenado: '
  write(*,*)dat

end program eje3

! subrutina para efectuar un ordenamiento
! utilizando el metodo de insercion
!
! se ingresa con:
!
! N   numero de elementos del array
! ARR array a ordenar
!
! en la salida se devuelve el array ordenado en ARR.
!
subroutine insert(n,arr)
implicit none
  integer, parameter ::d=selected_real_kind(16,200)
  integer :: n,ii,jj,flg
  real(d),dimension(n) :: arr
  real(d) :: vv

  do ii=2,n
    vv=arr(ii)
    jj=ii-1
    flg=0
    do while ((flg /= 1) .and. (jj > 0))
      if(vv < arr(jj))then
        arr(jj+1)=arr(jj)
        jj=jj-1
      else
        flg=1
      endif
    enddo
    arr(jj+1)=vv
  enddo 
  return
end subroutine
