Skip to content
← 返回算法列表
问题与数据结构

归并排序 ​

排序

说明 ​

递归排序两半再合并;稳定,时间 O(n log n)、额外空间 O(n)。

分析 ​

递归把数组分成两半,分别排序后通过比较两边当前元素完成合并。合并时优先取左侧相等元素可保持稳定性。

图解推演

[3,1,2] 拆为 [3] 与 [1,2],后者继续拆到单元素再合并。合并时两边各维护一个游标,每次取较小值;一边用尽就追加另一边。相等时先取左侧,是稳定性的来源,而不是“递归”本身保证稳定。

查看图表代码

适用前提与边界 ​

每层总工作为 O(n),层数为 O(log n);代价是需要额外的合并空间。

示例输入与调用 ​

go
fmt.Println(MergeSort([]int{3, 1, 2}))

运行输出 ​

text
[1 2 3]

完整 Go 示例 ​

go
package main

import "fmt"

func MergeSort(a []int) []int {
	if len(a) < 2 {
		return append([]int(nil), a...)
	}
	m := len(a) / 2
	l, r := MergeSort(a[:m]), MergeSort(a[m:])
	out := make([]int, 0, len(a))
	for len(l) > 0 && len(r) > 0 {
		if l[0] <= r[0] {
			out = append(out, l[0])
			l = l[1:]
		} else {
			out = append(out, r[0])
			r = r[1:]
		}
	}
	return append(append(out, l...), r...)
}

func main() {
	fmt.Println(MergeSort([]int{3, 1, 2}))
}

继续阅读