i_3_insertsort Subroutine

private pure subroutine i_3_insertsort(arr_len, key, arr1, arr2, arr3)

Sorts integer arrays key, arr1, arr2 and arr3 using insertion sort based on order of key.

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: arr_len
integer, intent(inout), dimension(1:arr_len) :: key
integer, intent(inout), dimension(1:arr_len) :: arr1
integer, intent(inout), dimension(1:arr_len) :: arr2
integer, intent(inout), dimension(1:arr_len) :: arr3

Contents

Source Code


Source Code

  pure subroutine i_3_insertsort(arr_len,key,arr1,arr2,arr3)
    implicit none
    !Size of arrays
    integer, intent(in) :: arr_len

    !Arrays to be sorted
    integer, intent(inout), dimension(1:arr_len) :: key, arr1, arr2, arr3

    !Internals
    integer :: i, j
    integer :: ak, a1, a2, a3 !Used to hold selected elements
    logical :: done_exit

    do j=2,arr_len
       !Get current value
       ak=key(j) ; a1=arr1(j) ; a2=arr2(j) ; a3=arr3(j)

       done_exit=.false.
       do i=j-1,1,-1
          !Escape loop
          if(key(i).le.ak)then
             done_exit=.true.
             exit
          endif

          !Shift values along one
          key(i+1)=key(i) ; arr1(i+1)=arr1(i) ; arr2(i+1)=arr2(i) ; arr3(i+1)=arr3(i)
       enddo
       if(.not.done_exit) i=0

       !Insert value in correct place in section
       key(i+1)=ak ; arr1(i+1)=a1 ; arr2(i+1)=a2 ; arr3(i+1)=a3
    enddo
  end subroutine i_3_insertsort