github.com/AESNooper/go/src@v0.0.0-20220218095104-b56a4ab1bbbb/sort/zfuncversion.go (about)

     1  // Code generated from sort.go using genzfunc.go; DO NOT EDIT.
     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  }