package algo
// SortMerge
func SortMerge(s []int) []int {
idx := len(s) / 2
if idx <= 0 {
return s
}
// recursion
return merge(SortMerge(s[:idx]), SortMerge(s[idx:]))
}
// merge left & right
func merge(l, r []int) []int {
ss := []int{}
for i, j := 0, 0; ; {
if i >= len(l) {
if j >= len(r) {
break
} else {
ss = append(ss, r[j])
j++
}
} else {
if j >= len(r) || l[i] < r[j] {
ss = append(ss, l[i])
i++
} else {
ss = append(ss, r[j])
j++
}
}
}
return ss
}
package algo
// SortHeap
func SortHeap(s []int) {
heapsize := buildMaxHeap(s)
for i := len(s) - 1; i > 0; i-- {
s[0], s[i] = s[i], s[0]
heapsize--
maxHeapify(s, heapsize, 0)
}
}
func parent(i int) int {
return (i - 1) / 2
}
func left(i int) int {
return i*2 + 1
}
func right(i int) int {
return i*2 + 2
}
func maxHeapify(s []int, heapsize, i int) {
li := left(i)
ri := right(i)
largest := i
if li < heapsize && s[li] > s[i] {
largest = li
}
if ri < heapsize && s[ri] > s[largest] {
largest = ri
}
if largest != i {
s[i], s[largest] = s[largest], s[i]
maxHeapify(s, heapsize, largest)
}
}
func buildMaxHeap(s []int) int {
heapsize := len(s)
for i := len(s) / 2; i >= 0; i-- {
maxHeapify(s, heapsize, i)
}
return heapsize
}
package algo
// SortQuick
func SortQuick(s []int) {
if len(s) > 0 {
q := partition(s)
SortQuick(s[:q])
SortQuick(s[q+1:])
}
}
func partition(s []int) int {
i := 0
r := len(s) - 1
for j := i; j < r; j++ {
if s[j] < s[r] {
if j != i {
s[i], s[j] = s[j], s[i]
// fmt.Printf("%+v %d <= %d, %d \n", s, i, j, r)
}
i++
}
}
if i != r {
s[i], s[r] = s[r], s[i]
// fmt.Printf("%+v %d <= %d \n", s, i, r)
}
return i
}