Sorts integer arrays key
, arr1
, arr2
and arr3
using
insertion sort based on order of key
.
Type | Intent | Optional | 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 |
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