github.com/andy2046/gopie@v0.7.0/pkg/mergesort/mergesort.go (about)

     1  // Package mergesort implements Mergesort.
     2  package mergesort
     3  
     4  // Sort sorts the slice.
     5  func Sort(data []int) {
     6  	aux := make([]int, len(data))
     7  	sort(data, aux)
     8  }
     9  
    10  func sort(a, aux []int) {
    11  	n := len(a)
    12  	for size := 1; size < n; size = 2 * size {
    13  		for lo := 0; lo < n-size; lo += 2 * size {
    14  			merge(a, aux, lo, lo+size-1, min(lo+size+size-1, n-1))
    15  		}
    16  	}
    17  }
    18  
    19  func merge(a, aux []int, lo, mid, hi int) {
    20  	for k := lo; k <= hi; k++ {
    21  		aux[k] = a[k]
    22  	}
    23  
    24  	i, j := lo, mid+1
    25  
    26  	for k := lo; k <= hi; k++ {
    27  		if i > mid {
    28  			a[k] = aux[j]
    29  			j++
    30  		} else if j > hi {
    31  			a[k] = aux[i]
    32  			i++
    33  		} else if aux[j] <= aux[i] {
    34  			a[k] = aux[j]
    35  			j++
    36  		} else {
    37  			a[k] = aux[i]
    38  			i++
    39  		}
    40  	}
    41  }
    42  
    43  func min(a, b int) int {
    44  	if a < b {
    45  		return a
    46  	}
    47  	return b
    48  }