Anonymous user
Sorting Algorithms/Circle Sort: Difference between revisions
→{{header|Fortran}}
Line 272:
=={{header|Fortran}}==
<lang fortran>
!
module circlesort▼
! I have commented the code that was here and also 'tightened up' various pieces such as how swap detection was done as well
! as fixing an error where the code would exceed array bounds for odd number sized arrays.
! Also, giving some some attribution to the author. - Pete
! This code is a Fortran adaptation of a Forth algorithm laid out by "thebeez" at this URL;
! https://sourceforge.net/p/forth-4th/wiki/Circle%20sort/
!
!▼
▲module circlesort
implicit none
logical, private :: csr
public :: circle_sort
contains
recursive
implicit none
integer, intent(in) ::
integer, intent(inout) :: a(n)
integer :: lo, hi, mid
integer :: temp
logical :: lefthalf,righthalf
▲!
swapped = .FALSE.
if (right <= left) return
lo = left !Store the upper and lower bounds of list for
hi = right !Recursion later
!
do while (lo < hi)
! Swap the pair of elements if hi < lo
if (a(hi) < a(lo)) then
temp = a(lo)
a(lo) = a(hi)
a(hi) = temp
lo = lo + 1
hi = hi - 1
end do
! Special case if
if
endif
endif
righthalf = csr(a, mid + 1, right,n)
end subroutine csr▼
swapped = swapped .or. lefthalf .or. righthalf
!
subroutine circle_sort(a, n)
use iso_c_binding, only: c_ptr, c_loc
implicit none
integer, intent(in) :: n
integer, target,intent(inout) :: a(n)
! This is the canonical algorithm. However, if you want to
! speed it up, count the iterations and when you have approached
▲ swaps = 0
! log(n) iterations, perform a binary insertion sort then exit the loop.
! For smaller sized arrays ~ 2million elements, 0.5*log(n) iterations works better, for larger
! arrays, take the former suggested number.
end do
end subroutine circle_sort
end module circlesort
program sort
use circlesort
|