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

插入排序 ​

排序

说明 ​

把当前值插入已排序前缀;近乎有序时很快,最坏 O(n²)。

分析 ​

循环开始时,左侧前缀始终有序;当前值向左寻找位置,并把较大的元素右移。输入接近有序时移动次数很少,因此小数组或排序算法的收尾阶段常会采用它。

图解推演

[3,1,2] 首先把 1 插入已排序前缀 [3],将 3 右移;然后把 2 插入 [1,3],只移动 3。循环不变量是当前位置之前已经有序。保存 key 后再移动元素,不能直接覆盖 key;相等元素不移动可保留稳定性。

查看图表代码

适用前提与边界 ​

完全逆序时仍需 O(n²) 次移动。

示例输入与调用 ​

go
a := []int{3, 1, 2}
	InsertionSort(a)
	fmt.Println(a)

运行输出 ​

text
[1 2 3]

完整 Go 示例 ​

go
package main

import "fmt"

func InsertionSort(a []int) {
	for i := 1; i < len(a); i++ {
		x := a[i]
		j := i
		for j > 0 && a[j-1] > x {
			a[j] = a[j-1]
			j--
		}
		a[j] = x
	}
}

func main() {
	a := []int{3, 1, 2}
	InsertionSort(a)
	fmt.Println(a)
}

继续阅读