Sorts integer arrays key
, arr1
and arr2
using insertion
sort based on order of key
.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer, | intent(in) | :: | arr_len |
Size of arrays |
||
integer, | intent(inout), | dimension(1:arr_len) | :: | key |
Arrays to be sorted |
|
integer, | intent(inout), | dimension(1:arr_len) | :: | arr1 |
Arrays to be sorted |
|
integer, | intent(inout), | dimension(1:arr_len) | :: | arr2 |
Arrays to be sorted |
pure subroutine i_2_insertsort(arr_len,key,arr1,arr2)
implicit none
!> Size of arrays
integer, intent(in) :: arr_len
!> Arrays to be sorted
integer, intent(inout), dimension(1:arr_len) :: key, arr1, arr2
!Internals
integer :: i, j
integer :: ak, a1, a2 !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)
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)
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
enddo
end subroutine i_2_insertsort