算法稳定性,时间复杂度,空间复杂度等算法基础知识:经典算法----基础知识
冒泡排序:基础算法----冒泡排序
选择排序:基础算法----选择排序
插入排序:基础算法----插入排序
快速排序:基础算法----快速排序
希尔排序:基础算法----希尔排序
归并排序:基础算法----归并排序
计数排序:基础算法----计数排序
桶排序: 基础算法----桶排序
基数排序:基础算法----基数排序
堆排序: 基础算法----堆排序
对少量元素的排序,插入排序是个不错的选择
一般情况下,插入排序会比冒泡排序快一倍,要比选择排序还要快一点
一 算法简介
插入排序是从无序部分取出一个元素,与有序部分中的元素从后向前依次进行比较,并找到合适的位置(从后往前,第一个大于等于或小于等于当前元素的元素后面),将该元素插到有序组当中。重复该过程,直到所有元素都插入到正确的位置
二 时间复杂度,空间复杂度
一) 时间复杂度
循环次数
最好情况(与期望顺序相同):
T(n) = n-1
最坏情况(与期望顺序相反):
T(n) = (n-1) + (n-2) + (n-3) + … + 1
= n(n-1)/2
位置交换次数
最好情况:交换0次
最坏情况:交换n(n-1)/2次
平均时间复杂度为 T(n) = O(n2)
二) 空间复杂度
插入排序不需要额外的空间,所以空间复杂度为 S(n) = O(1)
三 算法稳定性
每次把当前元素插入到有序序列中小于等于或大于等于当前元素的元素后面,相同的元素位置将保持原有位置不变, 插入排序是一种稳定的排序算法
四 实现
一) 步骤
1) 从无序部分取出一个元素(当前元素),与有序部分中的元素从后向前依次进行比较,并找到合适的位置(从后往前,第一个大于等于或小于等于当前元素的元素后面),将该元素插到有序组当中
2) 重复上面的步骤 1),直到所有元素都插入到正确的位置
二) 过程图
使用 {40, 30, 50, 40, 20, 60, 10, 70} 演示从小到大的排序过程
初始状态
1) 外层第一次循环
2) 外层第二次循环
3) 外层第三次循环
4) 外层第四次循环
5) 外层第五次循环
6) 外层第六次循环
7) 外层第七次循环
三) 代码实现
func InsertionSort(arr []int) {
if len(arr) <= 1 {
return
}
for i := 1; i < len(arr); i++ {
for j := i; j > 0 && arr[j-1] > arr[j]; j-- {
arr[j-1], arr[j] = arr[j], arr[j-1]
}
}
return
}