1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
|
C
C File: sort_MergeSort_Impl.f
C Symbol: sort.MergeSort-v0.1
C Symbol Type: class
C Babel Version: 0.10.2
C Description: Server-side implementation for sort.MergeSort
C
C WARNING: Automatically generated; only changes within splicers preserved
C
C babel-version = 0.10.2
C
C
C Symbol "sort.MergeSort" (version 0.1)
C
C Merge sort
C
C DO-NOT-DELETE splicer.begin(_miscellaneous_code_start)
C This file contains an interative (non-recursive) version of mergesort.
subroutine mergeLists(elems, comp, cmp, swp, start, mid, last)
implicit none
integer*8 elems, comp, cmp, swp
integer*4 start, mid, last, j
integer*4 compres, counter
integer*4 m, s
m = mid
s = start
do while ((s .lt. m) .and. (m .lt. last))
call sort_Counter_inc_f(cmp, counter)
call sort_Container_compare_f(elems, s, m, comp,
$ compres)
if (compres .gt. 0) then
do j = m, s + 1, -1
call sort_Counter_inc_f(swp, counter)
call sort_Container_swap_f(elems, j, j - 1)
enddo
m = m + 1
endif
s = s + 1
enddo
end
C DO-NOT-DELETE splicer.end(_miscellaneous_code_start)
C
C Class constructor called when the class is created.
C
subroutine sort_MergeSort__ctor_fi(self)
implicit none
C in sort.MergeSort self
integer*8 self
C DO-NOT-DELETE splicer.begin(sort.MergeSort._ctor)
C DO-NOT-DELETE splicer.end(sort.MergeSort._ctor)
end
C
C Class destructor called when the class is deleted.
C
subroutine sort_MergeSort__dtor_fi(self)
implicit none
C in sort.MergeSort self
integer*8 self
C DO-NOT-DELETE splicer.begin(sort.MergeSort._dtor)
C DO-NOT-DELETE splicer.end(sort.MergeSort._dtor)
end
C
C Static class initializer called exactly once before any user-defined method is dispatched
C
subroutine sort_MergeSort__load_fi()
implicit none
C DO-NOT-DELETE splicer.begin(sort.MergeSort._load)
C Insert the implementation here...
C DO-NOT-DELETE splicer.end(sort.MergeSort._load)
end
C
C Sort elements using Merge Sort.
C
subroutine sort_MergeSort_sort_fi(self, elems, comp)
implicit none
C in sort.MergeSort self
integer*8 self
C in sort.Container elems
integer*8 elems
C in sort.Comparator comp
integer*8 comp
C DO-NOT-DELETE splicer.begin(sort.MergeSort.sort)
integer*8 cmp, swp
integer*4 stride, i, mid, last, len
mid = 1
stride = 2
call sort_Container_getLength_f(elems, len)
call sort_MergeSort_getCompareCounter_f(self, cmp)
call sort_MergeSort_getSwapCounter_f(self, swp)
do while (mid .lt. len)
do i = 0, len - mid, stride
last = i + stride
if (last .gt. len) then
last = len
endif
call mergeLists(elems, comp, cmp, swp,
$ i, i + mid, last)
enddo
mid = stride
stride = stride + stride
enddo
call sort_Counter_deleteRef_f(cmp)
call sort_Counter_deleteRef_f(swp)
C DO-NOT-DELETE splicer.end(sort.MergeSort.sort)
end
C
C Return merge sort.
C
subroutine sort_MergeSort_getName_fi(self, retval)
implicit none
C in sort.MergeSort self
integer*8 self
C out string retval
character*(*) retval
C DO-NOT-DELETE splicer.begin(sort.MergeSort.getName)
retval = 'Merge sort (non-recursive)'
C DO-NOT-DELETE splicer.end(sort.MergeSort.getName)
end
C DO-NOT-DELETE splicer.begin(_miscellaneous_code_end)
C Insert extra code here...
C DO-NOT-DELETE splicer.end(_miscellaneous_code_end)
|