核心原理
将元素分为有序区(初始为第一个元素)和无序区,取无序区第一个元素和有序区元素依次比较,比这个元素大的往后稍,直到找到小于等于它的位置,然后把这个元素插进去。
通俗步骤
- 把数组第一个元素当作初始的有序区间;
- 依次取出无序区间的第一个元素,向前遍历有序区间;
- 比当前元素大的元素整体后移一位,直到找到小于等于它的位置;
- 将该元素插入空位;
- 重复直到全部有序。
举例演示 [3,1,4,2]
第一轮
[3]有序区间,[1,4,2]无序区间; 取无序区第一个数1依次和有序区[3]比较,3>1,将3后移,1插入3原来的位置;
第二轮
[1,3]有序区间,[4,2]无序区间; 取无序区第一个数1依次和有序区[1,3]比较,4>1且4>3,4插入末尾;
第三轮
[1,3,4]有序区间,[2]无序区间; 取无序区第一个数2依次和有序区[1,3,4]比较,2>1且2<3,将3,4后移,2插入3原来的位置;
此时排序完成,[1,2,3,4]
代码示例
package main
import (
"fmt"
)
func main() {
sortArr := []int{3, 1, 4, 2}
fmt.Println("排序前:", sortArr) // [3,1,4,2]
fmt.Println("排序后:", insertionSort(sortArr)) // [1,2,3,4]
}
func insertionSort(arr []int) []int {
arrLen := len(arr)
for i := 1; i < arrLen; i++ {
current := arr[i]
j := i - 1
for j >= 0 && arr[j] > current {
arr[j+1] = arr[j]
j--
}
arr[j+1] = current
}
return arr
}