title: Go数据结构与算法-插入排序
tags: go,算法
介绍
插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
基本思想
在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。
算法复杂度
平均时间复杂度 O(n2)
排序过程
数组 [29 10 14 37 14]
[UNSORTED]: [29 10 14 37 14]
[DEBUG]: [10 29 14 37 14] # 10 找到位置
[DEBUG]: [10 14 29 37 14] # 14 找到位置
[DEBUG]: [10 14 29 37 14] # 37 找到位置
[DEBUG]: [10 14 14 29 37] # 14 找到位置
[SORTED]: [10 14 14 29 37]
使用场景
和冒泡排序类似,直接插入排序也是双层嵌套循环,比较后插入有序区间。不适合大数据量排序。因为其比较次数取决于乱序程度,所以对于小数据量(如 1k 个元素以内)或基本有序的大数据量集合进行插入排序都适合。
演示
package main
import (
"algorithms"
"fmt"
)
func main() {
arr := algorithms.GetArr(5, 20)
arr = []int{29, 10, 14, 37, 14}
fmt.Println("[UNSORTED]: ", arr)
n := len(arr)
if n <= 1 {
fmt.Println("[ALREADY SORTED]: ", arr)
return
}
// 遍历所有元素
for i := 1; i < n; i++ {
// 向前找位置
for j := i; j > 0; j-- {
// 合适位置插入
if arr[j-1] > arr[j] {
arr[j-1], arr[j] = arr[j], arr[j-1]
}
}
fmt.Println("[DEBUG]: ", arr)
}
fmt.Println("[SORTED]: ", arr)
}