AcWing 787. 归并排序
https://www.acwing.com/problem/content/789/
package main
import (
"fmt"
)
func main() {
var n int
fmt.Scanf("%d", &n)
q := make([]int, n)
tmp := make([]int, n)
for i := 0; i < n; i++ {
fmt.Scanf("%d", &q[i])
}
mergeSort(q, tmp, 0, n-1)
//输出
for i := 0; i < n; i++ {
fmt.Printf("%d ", q[i])
}
fmt.Println()
}
func mergeSort(q, tmp []int, l int, r int) {
if l >= r {
return
}
//优化写法 可以防止溢出
mid := l + (r-l)>>1
//mid := (l + r) >> 1
//fmt.Printf("r : %d ", r>>1)
mergeSort(q, tmp, l, mid)
mergeSort(q, tmp, mid+1, r)
k := 0
i := l
j := mid + 1
for i <= mid && j <= r {
if q[i] <= q[j] {
tmp[k] = q[i]
k++
i++
} else {
tmp[k] = q[j]
k++
j++
}
}
for i <= mid {
tmp[k] = q[i]
k++
i++
}
for j <= r {
tmp[k] = q[j]
k++
j++
}
for i, j = l, 0; i <= r; i, j = i+1, j+1 {
q[i] = tmp[j]
}
}

浙公网安备 33010602011771号