基础算法----插入排序(Insertion Sort)

算法稳定性,时间复杂度,空间复杂度等算法基础知识经典算法----基础知识
冒泡排序基础算法----冒泡排序
选择排序基础算法----选择排序
插入排序基础算法----插入排序
快速排序基础算法----快速排序
希尔排序基础算法----希尔排序
归并排序基础算法----归并排序
计数排序基础算法----计数排序
桶排序基础算法----桶排序
基数排序基础算法----基数排序
堆排序基础算法----堆排序

对少量元素的排序,插入排序是个不错的选择
一般情况下,插入排序会比冒泡排序快一倍,要比选择排序还要快一点

一 算法简介

插入排序是从无序部分取出一个元素,与有序部分中的元素从后向前依次进行比较,并找到合适的位置(从后往前,第一个大于等于或小于等于当前元素的元素后面),将该元素插到有序组当中。重复该过程,直到所有元素都插入到正确的位置

二 时间复杂度,空间复杂度

一) 时间复杂度

循环次数
最好情况(与期望顺序相同):
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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值