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]
	}

}
posted @ 2026-01-02 01:45  BlackSnow  阅读(9)  评论(0)    收藏  举报