1 // DO NOT EDIT; AUTO-GENERATED from sort.go using genzfunc.go 2 3 // Copyright 2016 The Go Authors. All rights reserved. 4 // Use of this source code is governed by a BSD-style 5 // license that can be found in the LICENSE file. 6 7 package sort 8 9 // Auto-generated variant of sort.go:insertionSort 10 func insertionSort_func(data lessSwap, a, b int) { 11 for i := a + 1; i < b; i++ { 12 for j := i; j > a && data.Less(j, j-1); j-- { 13 data.Swap(j, j-1) 14 } 15 } 16 } 17 18 // Auto-generated variant of sort.go:siftDown 19 func siftDown_func(data lessSwap, lo, hi, first int) { 20 root := lo 21 for { 22 child := 2*root + 1 23 if child >= hi { 24 break 25 } 26 if child+1 < hi && data.Less(first+child, first+child+1) { 27 child++ 28 } 29 if !data.Less(first+root, first+child) { 30 return 31 } 32 data.Swap(first+root, first+child) 33 root = child 34 } 35 } 36 37 // Auto-generated variant of sort.go:heapSort 38 func heapSort_func(data lessSwap, a, b int) { 39 first := a 40 lo := 0 41 hi := b - a 42 for i := (hi - 1) / 2; i >= 0; i-- { 43 siftDown_func(data, i, hi, first) 44 } 45 for i := hi - 1; i >= 0; i-- { 46 data.Swap(first, first+i) 47 siftDown_func(data, lo, i, first) 48 } 49 } 50 51 // Auto-generated variant of sort.go:medianOfThree 52 func medianOfThree_func(data lessSwap, m1, m0, m2 int) { 53 if data.Less(m1, m0) { 54 data.Swap(m1, m0) 55 } 56 if data.Less(m2, m1) { 57 data.Swap(m2, m1) 58 if data.Less(m1, m0) { 59 data.Swap(m1, m0) 60 } 61 } 62 } 63 64 // Auto-generated variant of sort.go:swapRange 65 func swapRange_func(data lessSwap, a, b, n int) { 66 for i := 0; i < n; i++ { 67 data.Swap(a+i, b+i) 68 } 69 } 70 71 // Auto-generated variant of sort.go:doPivot 72 func doPivot_func(data lessSwap, lo, hi int) (midlo, midhi int) { 73 m := int(uint(lo+hi) >> 1) 74 if hi-lo > 40 { 75 s := (hi - lo) / 8 76 medianOfThree_func(data, lo, lo+s, lo+2*s) 77 medianOfThree_func(data, m, m-s, m+s) 78 medianOfThree_func(data, hi-1, hi-1-s, hi-1-2*s) 79 } 80 medianOfThree_func(data, lo, m, hi-1) 81 pivot := lo 82 a, c := lo+1, hi-1 83 for ; a < c && data.Less(a, pivot); a++ { 84 } 85 b := a 86 for { 87 for ; b < c && !data.Less(pivot, b); b++ { 88 } 89 for ; b < c && data.Less(pivot, c-1); c-- { 90 } 91 if b >= c { 92 break 93 } 94 data.Swap(b, c-1) 95 b++ 96 c-- 97 } 98 protect := hi-c < 5 99 if !protect && hi-c < (hi-lo)/4 { 100 dups := 0 101 if !data.Less(pivot, hi-1) { 102 data.Swap(c, hi-1) 103 c++ 104 dups++ 105 } 106 if !data.Less(b-1, pivot) { 107 b-- 108 dups++ 109 } 110 if !data.Less(m, pivot) { 111 data.Swap(m, b-1) 112 b-- 113 dups++ 114 } 115 protect = dups > 1 116 } 117 if protect { 118 for { 119 for ; a < b && !data.Less(b-1, pivot); b-- { 120 } 121 for ; a < b && data.Less(a, pivot); a++ { 122 } 123 if a >= b { 124 break 125 } 126 data.Swap(a, b-1) 127 a++ 128 b-- 129 } 130 } 131 data.Swap(pivot, b-1) 132 return b - 1, c 133 } 134 135 // Auto-generated variant of sort.go:quickSort 136 func quickSort_func(data lessSwap, a, b, maxDepth int) { 137 for b-a > 12 { 138 if maxDepth == 0 { 139 heapSort_func(data, a, b) 140 return 141 } 142 maxDepth-- 143 mlo, mhi := doPivot_func(data, a, b) 144 if mlo-a < b-mhi { 145 quickSort_func(data, a, mlo, maxDepth) 146 a = mhi 147 } else { 148 quickSort_func(data, mhi, b, maxDepth) 149 b = mlo 150 } 151 } 152 if b-a > 1 { 153 for i := a + 6; i < b; i++ { 154 if data.Less(i, i-6) { 155 data.Swap(i, i-6) 156 } 157 } 158 insertionSort_func(data, a, b) 159 } 160 } 161 162 // Auto-generated variant of sort.go:stable 163 func stable_func(data lessSwap, n int) { 164 blockSize := 20 165 a, b := 0, blockSize 166 for b <= n { 167 insertionSort_func(data, a, b) 168 a = b 169 b += blockSize 170 } 171 insertionSort_func(data, a, n) 172 for blockSize < n { 173 a, b = 0, 2*blockSize 174 for b <= n { 175 symMerge_func(data, a, a+blockSize, b) 176 a = b 177 b += 2 * blockSize 178 } 179 if m := a + blockSize; m < n { 180 symMerge_func(data, a, m, n) 181 } 182 blockSize *= 2 183 } 184 } 185 186 // Auto-generated variant of sort.go:symMerge 187 func symMerge_func(data lessSwap, a, m, b int) { 188 if m-a == 1 { 189 i := m 190 j := b 191 for i < j { 192 h := int(uint(i+j) >> 1) 193 if data.Less(h, a) { 194 i = h + 1 195 } else { 196 j = h 197 } 198 } 199 for k := a; k < i-1; k++ { 200 data.Swap(k, k+1) 201 } 202 return 203 } 204 if b-m == 1 { 205 i := a 206 j := m 207 for i < j { 208 h := int(uint(i+j) >> 1) 209 if !data.Less(m, h) { 210 i = h + 1 211 } else { 212 j = h 213 } 214 } 215 for k := m; k > i; k-- { 216 data.Swap(k, k-1) 217 } 218 return 219 } 220 mid := int(uint(a+b) >> 1) 221 n := mid + m 222 var start, r int 223 if m > mid { 224 start = n - b 225 r = mid 226 } else { 227 start = a 228 r = m 229 } 230 p := n - 1 231 for start < r { 232 c := int(uint(start+r) >> 1) 233 if !data.Less(p-c, c) { 234 start = c + 1 235 } else { 236 r = c 237 } 238 } 239 end := n - start 240 if start < m && m < end { 241 rotate_func(data, start, m, end) 242 } 243 if a < start && start < mid { 244 symMerge_func(data, a, start, mid) 245 } 246 if mid < end && end < b { 247 symMerge_func(data, mid, end, b) 248 } 249 } 250 251 // Auto-generated variant of sort.go:rotate 252 func rotate_func(data lessSwap, a, m, b int) { 253 i := m - a 254 j := b - m 255 for i != j { 256 if i > j { 257 swapRange_func(data, m-i, m, j) 258 i -= j 259 } else { 260 swapRange_func(data, m-i, m+j-i, i) 261 j -= i 262 } 263 } 264 swapRange_func(data, m-i, m, i) 265 } 266