插入排序
插入排序的基本操作就是将一个记录插入到有效表中。
代码实现
package insertSort
func InsertSort(arr []int) []int {
// 数组长度
length := len(arr)
// 数组为空或者数组只有一个元素
if length <= 1 {
return arr
}
for i := 1; i < length; i++ {
// 备份待插入的数据
backup := arr[i]
// 初始化待插入位置
j := i - 1
// 待插入数据,小于前面的数据
for j >= 0 && backup < arr[j] {
// 从前往后移动
arr[j+1] = arr[j]
j--
}
arr[j+1] = backup
}
return arr
}
时间复杂度
最好的情况,本来就是表有序的,则时间复杂度为O(n)。
最坏的情况,本来的表是逆序的,在时间复杂度为O(n^2)。
虽然同为O(n^2),但是插入排序的性能比冒泡排序、选择排序要好。
稳定性
插入排序是一个稳定排序算法。
插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。