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 }