Commit 811e6784 authored by Lefebvre, Jordan's avatar Lefebvre, Jordan

Running dos2unix on mergesort.f90 and adding declspec export for shared windows build.

parent d86eca47
Pipeline #20021 passed with stages
in 15 minutes and 30 seconds
subroutine merge_sort(n, a, indices)
! This routine takes an input array 'a' of dimension (n)
! and an input array 'indices' of dimension (n)
! and conducts a merge sort on array 'a' while saving the original order
! to array 'indices'
! The first pass sorts each pair of consecutive elements [a(i) vs. a(i+1)].
! The second pass sorts adjacent sequences of length 2 [a(i), a(i+1) vs. a(i+2), a(i+3)]; the sequences are already ordered, due to step 1.
! The third pass sorts adjacent sequences of length 4 [a(i),...,a(i+3) vs. a(i+4),...,a(i+7)]; the sequences are already ordered, from step 2.
! This continues for L1 passes, where 2**(L1-1) < n < 2**L1. Note that n does not need to be a power of 2.
implicit none
integer :: i, imax, i0, j, jmax, k, L, L1, m, n
real, intent(inout) :: a(n)
integer, intent(out) :: indices(n)
real, allocatable :: b(:)
allocate (b(n))
L1 = 1
m = 1
do while (m < n) ! Determine L1 so that 2**(L1-1) < n < 2**L1
m = m + m
L1 = L1 + 1
end do
L1 = L1 - 1
m = 1
do L=1, L1
k=1
do i0=1, n-m+1, m+m
i=i0
j=i+m
imax=j
jmax=j+m
if(imax > n) imax = n + 1
if(jmax > n) jmax = n + 1
do while(i < imax .and. j < jmax)
if(a(i) < a(j)) then
b(k) = a(i)
indices(k) = i
i = i + 1
else
b(k) = a(j)
indices(k) = j
j = j + 1
end if
k = k + 1
end do
do while(i < imax)
b(k) = a(i)
indices(k) = i
i = i + 1
k = k + 1
end do
do while(j < jmax)
b(k) = a(j)
indices(k) = j
j = j + 1
k = k + 1
end do
end do
m = m + m
a = b
end do
if(allocated(b)) deallocate(b)
return
end subroutine merge_sort
subroutine merge_sort(n, a, indices)
! This routine takes an input array 'a' of dimension (n)
! and an input array 'indices' of dimension (n)
! and conducts a merge sort on array 'a' while saving the original order
! to array 'indices'
! The first pass sorts each pair of consecutive elements [a(i) vs. a(i+1)].
! The second pass sorts adjacent sequences of length 2 [a(i), a(i+1) vs. a(i+2), a(i+3)]; the sequences are already ordered, due to step 1.
! The third pass sorts adjacent sequences of length 4 [a(i),...,a(i+3) vs. a(i+4),...,a(i+7)]; the sequences are already ordered, from step 2.
! This continues for L1 passes, where 2**(L1-1) < n < 2**L1. Note that n does not need to be a power of 2.
implicit none
!DEC$ ATTRIBUTES DLLEXPORT::merge_sort
integer :: i, imax, i0, j, jmax, k, L, L1, m, n
real, intent(inout) :: a(n)
integer, intent(out) :: indices(n)
real, allocatable :: b(:)
allocate (b(n))
L1 = 1
m = 1
do while (m < n) ! Determine L1 so that 2**(L1-1) < n < 2**L1
m = m + m
L1 = L1 + 1
end do
L1 = L1 - 1
m = 1
do L=1, L1
k=1
do i0=1, n-m+1, m+m
i=i0
j=i+m
imax=j
jmax=j+m
if(imax > n) imax = n + 1
if(jmax > n) jmax = n + 1
do while(i < imax .and. j < jmax)
if(a(i) < a(j)) then
b(k) = a(i)
indices(k) = i
i = i + 1
else
b(k) = a(j)
indices(k) = j
j = j + 1
end if
k = k + 1
end do
do while(i < imax)
b(k) = a(i)
indices(k) = i
i = i + 1
k = k + 1
end do
do while(j < jmax)
b(k) = a(j)
indices(k) = j
j = j + 1
k = k + 1
end do
end do
m = m + m
a = b
end do
if(allocated(b)) deallocate(b)
return
end subroutine merge_sort
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment